iCarousel показывает изображения только после изменения размера
Я импортировал iCarousel, предоставленный nicklockwood, в приложение macOs. https://github.com/nicklockwood/iCarousel
Приложение написано на Swift. После того, как все заработало (импорт файлов.m и.h, добавление Bridging Header), есть одна небольшая вещь.
Как только приложение запущено и NSViewController активирован, я вижу пустой ViewController. Только если я начну изменять размер представления, я вижу iCarousel со всей загруженной картинкой.
Мой код выглядит следующим образом:
class CarouselViewController: NSViewController, iCarouselDataSource, iCarouselDelegate {
var images = [NSImage]()
@IBOutlet var carousel: iCarousel!
override func awakeFromNib() {
super.awakeFromNib()
loadImages()
}
override func viewDidLoad() {
super.viewDidLoad()
self.carousel.type = iCarouselType.coverFlow
self.carousel.dataSource = self
self.carousel.delegate = self
carousel.reloadData()
}
func loadImages() {
let filePath = "/pics/"
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.picturesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
let path = paths?.appending(filePath)
//
let fileManager = FileManager.default
let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path!)!
while let element = enumerator.nextObject() as? String {
if element.hasSuffix("jpg") || element.hasSuffix("png") {
if let image = NSImage(contentsOfFile: path! + element) {
print("File: \(path!)\(element)")
self.images.append(image)
}
}
}
}
func numberOfItems(in carousel: iCarousel) -> Int {
return images.count
}
func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: NSView?) -> NSView {
let imageView = NSImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
imageView.image = self.images[index]
imageView.imageScaling = .scaleAxesIndependently
return imageView
}
func carouselItemWidth(_ carousel: iCarousel) -> CGFloat {
return 200.0
}
}
Как я могу отобразить свой iCarousel без изменения размера в первую очередь?
Спасибо
1 ответ
Я думаю, я нашел одно решение:
Рисование фактических изображений в карусели запускается layOutItemViews или layoutSubviews. Одна из общедоступных функций - это setType, которая позволяет установить тип карусели. Если я установлю тип после назначения dataSource и после загрузки данных, изображения будут отображаться нормально. Поэтому самый простой ответ - изменить viewDidLayout следующим образом:
override func viewDidLoad() {
super.viewDidLoad()
self.carousel.dataSource = self
self.carousel.delegate = self
carousel.reloadData()
// Triggers layOutItemView and thus will render all images.
self.carousel.type = iCarouselType.coverFlow
}
Теперь также можно назначить источник данных через раскадровку и инспектор соединений.