2017-09-14 75 views
0

我已將nicklockwood提供的iCarousel導入到macOs應用程序中。 https://github.com/nicklockwood/iCarouseliCarousel僅在調整大小後才顯示圖像

該應用程序是用Swift編寫的。 在設法使所有工作都正常(導入.m和.h文件,添加Bridging Header)之後,有一件小事。

一旦應用程序啓動,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?

謝謝

+0

我已經手動添加委託和數據源,因爲我認爲它可以解決我的問題。在我的初始版本中,我通過故事板和連接檢查器連接了數據源和委託,結果相同。 –

回答

0

我想我已經找到了一個解決方案:

在傳送帶上的實際圖像的繪製由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 

} 

現在,它也可以通過故事板和連接檢查指定數據源。

相關問題