2017-09-14 5 views
0

maclocksが提供するiCarouselをmaclocksアプリケーションにインポートしました。 https://github.com/nicklockwood/iCarouseliCarouselはリサイズ後にのみ画像を表示します

アプリはSwiftで書かれています。 すべての作業(.mと.hファイルをインポートし、Bridging Headerを追加する)を管理した後には、小さな問題が1つあります。

アプリが起動して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を表示するために管理することができますか?

カルーセル内の実際の画像の描画がlayOutItemViewsまたはlayoutSubviewsによってトリガーされます。

は私が一つの解決策を見つけたと思い、あなたに

+0

代理人とデータソースを手作業で追加しましたが、問題が解決すると思っていました。私の最初のバージョンでは、私は同じデータソースとストーリーボードと接続インスペクタを介して同じ結果を委譲しました。 –

答えて

0

ありがとうございます。 publicにアクセス可能な関数の1つは、カルーセル型を設定できる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 

} 

は、今ではストーリーボードとの接続インスペクタを経由してデータソースを割り当てることも可能です。

関連する問題