iCarousel仅在调整大小后显示图像

时间:2017-09-14 22:27:58

标签: swift macos nsviewcontroller icarousel

我已将nicklockwood提供的iCarousel导入macOs应用程序。 https://github.com/nicklockwood/iCarousel

该应用程序是用Swift编写的。 在管理完所有工作(导入.m和.h文件,添加桥接头)之后,有一件小事。

启动应用程序并激活NSViewController后,我看到一个空白的ViewController。只有当我开始调整视图大小时,我才会看到带有所有加载图片的iCarousel。

View after app start

View after resizing

我的代码如下所示:

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 个答案:

答案 0 :(得分:1)

我想我找到了一个解决方案:

通过layOutItemViews或layoutSubviews触发轮播中实际图像的绘制。一个可公开访问的函数是setType,它允许设置轮播类型。 如果我在分配dataSource后设置类型,并在加载数据后,图像将正常显示。 因此,最简单的答案是更改viewDidLayout,如下所示:

{{1}}

现在也可以通过情节提要和连接检查器分配数据源。