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

}

Теперь также можно назначить источник данных через раскадровку и инспектор соединений.

Другие вопросы по тегам