iCarousel shows images only after resize

194 views Asked by At

I have imported the iCarousel provided by nicklockwood into a macOs app. https://github.com/nicklockwood/iCarousel

The app is written in Swift. After managing to get everything working (importing .m and .h files, adding Bridging Header) there is one minor thing.

Once the app is started and the NSViewController is activated I see a blank ViewController. Only if I start resizing the view I see the iCarousel with all loaded picture.

View after app start

View after resizing

My code looks like the following:

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
    }

}

How can I manage to display my iCarousel without resizing first?

Thank you

1

There are 1 answers

0
Oliver Koehler On

I guess I've found one solution:

The drawing of the actual images in the carousel is triggered by layOutItemViews or layoutSubviews. One function that is public accessible is setType which allows to set the carousel type. If I set the type after assigning dataSource and after loading the data, the images will be displayed fine. So the most simple answer is to change viewDidLayout like the following:

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

}

Now it is also possible to assign datasource via storyboard and the Connection inspector.