2017-09-14 19 views
0

nicklockwood에서 제공 한 iCarousel을 macOs 앱으로 가져 왔습니다. https://github.com/nicklockwood/iCarouseliCarousel은 크기 변경 후 이미지 만 표시합니다.

응용 프로그램은 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을 표시 관리 할 수 ​​있습니까?

회전 목마의 실제 이미지의 도면이 layOutItemViews 또는 layoutSubviews에 의해 트리거 :

내가 하나 개의 솔루션을 발견 한 것 같아요 당신에게

+0

델리게이트와 데이터 소스를 수동으로 추가하여 문제가 해결 될 것이라고 생각했습니다. 내 초기 버전에서는 동일한 결과로 스토리 보드와 연결 관리자를 통해 데이터 소스와 위임을 연결했습니다. –

답변

0

감사드립니다. 공개적으로 액세스 할 수있는 함수 중 하나는 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 

} 

가 지금은 스토리 보드와 연결 관리자를 통해 데이터 소스를 지정하는 것도 가능합니다.