2015-05-05 44 views
6

iOS geliştiriciden geliyorum ve iOS'ta UICollectionView gibi programlı bir şekilde NSCollectionView programlı olarak kurmanın bir yolu olup olmadığını merak ediyorum? Ve NSCollectionViewItems kodunu ekleyin. Veya bağlama kullanmak için NSCollectionView kurmak için tek yol mu?Swift'de NSCollectionView programlı olarak kurmanın bir yolu var mı?

Teşekkür ederiz!

+0

son soruya cevap vermek için, hayır, basit gerekmez bulunuyor Bağlamaları kullanmak. Bağlamaları kullanmanız gereken bir görünüm veya denetim yoktur. – stevesliva

+0

Ama bunu bağlama olmadan nasıl yapabilirim? – stefOCDP

+1

[Bu] 'yı (http://stackoverflow.com/questions/8660626/how-to-create-nscollectionview-programatically-from-scratch) hızlıca dönüştürün. – stevesliva

cevap

5

@stevesliva bana this SO answer numaralı telefonu işaret ettiğinden dolayı teşekkür ederiz. Onu Swift'e dönüştürdüm. Elime geçen bu.

Ben viewController bir NSCollectionView oluşturma: viewController içinde

import Cocoa 

class ViewController: NSViewController { 

var titles = [String]() 
var collectionView: NSCollectionView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.titles = ["Banana", "Apple", "Strawberry", "Cherry", "Pear", "Pineapple", "Grape", "Melon"] 
    collectionView = NSCollectionView(frame: self.view.frame) 
    collectionView!.itemPrototype = CollectionViewItem() 
    collectionView!.content = self.titles 
    collectionView!.autoresizingMask = NSAutoresizingMaskOptions.ViewWidthSizable | NSAutoresizingMaskOptions.ViewMaxXMargin | NSAutoresizingMaskOptions.ViewMinYMargin | NSAutoresizingMaskOptions.ViewHeightSizable | NSAutoresizingMaskOptions.ViewMaxYMargin 

    var index = 0 
    for title in titles { 
     var item = self.collectionView!.itemAtIndex(index) as! CollectionViewItem 
     item.getView().button?.title = self.titles[index] 
     index++ 
    } 
    self.view.addSubview(collectionView!) 

} 
} 

oluşturulan CollectionViewItem Sadece madde görünümünü kendisi ayarlanmış bir görünüm yükleyin.

import Cocoa 

class CollectionViewItem: NSCollectionViewItem { 

var itemView: ItemView? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 
} 

override func loadView() { 
    self.itemView = ItemView(frame: NSZeroRect) 
    self.view = self.itemView! 
} 

func getView() -> ItemView { 
    return self.itemView! 
} 
} 

görünüm kendisi:

import Cocoa 

class ItemView: NSView { 

let buttonSize: NSSize = NSSize(width: 100, height: 20) 
let itemSize: NSSize = NSSize(width: 120, height: 40) 
let buttonOrigin: NSPoint = NSPoint(x: 10, y: 10) 

var button: NSButton? 

override func drawRect(dirtyRect: NSRect) { 
    super.drawRect(dirtyRect) 

    // Drawing code here. 
} 

override init(frame frameRect: NSRect) { 
    super.init(frame: NSRect(origin: frameRect.origin, size: itemSize)) 
    let newButton = NSButton(frame: NSRect(origin: buttonOrigin, size: buttonSize)) 
    newButton.bezelStyle = NSBezelStyle.RoundedBezelStyle 
    self.addSubview(newButton) 
    self.button = newButton; 
} 

required init?(coder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func setButtonTitle(title: String) { 
    self.button!.title = title 
} 
} 

düğme başlığıyla ayarlamak için, bir hack tür kullanıyorum. (ViewController'da for-loop) Eğer başlığı ayarlamak için daha iyi bir yol varsa, lütfen yorum bırakabilirsiniz.

+0

Düğme başlığını ayarlamak için: ViewController for döngüsü için: 'item.representedObject = title'. Daha sonra ItemView: 'NSButton * aButton = [[NSButton alloc] initWithFrame: NSMakeRect (10, 10, 100, 20)]; [aButton bağlama: NSTitleBinding toObject: self withKeyPath: @ "representObject" seçenekleri: @ {NSNullPlaceholderBindingOption: @ "Başlık yok"}]; [self.view addSubview: aButton]; ' 'Button.title = representObject' özelliğini kullanmayın, çünkü o anda temsil edilenObject bilinmeyecektir.Bağlanma çalışma zamanında çözülecektir. –

4

Swift 2.0 için, size collectionView!.autoresizingMask hat değiştirmek gerekir:

uzun el:

collectionView?.autoresizingMask = NSAutoresizingMaskOptions([NSAutoresizingMaskOptions.ViewWidthSizable,NSAutoresizingMaskOptions.ViewMaxXMargin,NSAutoresizingMaskOptions.ViewMinYMargin,NSAutoresizingMaskOptions.ViewHeightSizable,NSAutoresizingMaskOptions.ViewMaxYMargin]) 

veya kısa elle: Sen NSScrollView içinde NSCollectionView gömmek gerekir

collectionView?.autoresizingMask = NSAutoresizingMaskOptions([.ViewWidthSizable,.ViewMaxXMargin,.ViewMinYMargin,.ViewHeightSizable,.ViewMaxYMargin]) 
0

. Kod aşağıda Kur NSCollectionView

let layout = NSCollectionViewFlowLayout() 
layout.minimumLineSpacing = 4 

collectionView = NSCollectionView() 
collectionView.dataSource = self 
collectionView.delegate = self 
collectionView.collectionViewLayout = layout 
collectionView.allowsMultipleSelection = false 
collectionView.backgroundColors = [.clear] 
collectionView.isSelectable = true 
collectionView.register(
    Cell.self, 
    forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell") 
) 

Kur

Swift 4 içindedir NSScrollView

scrollView = NSScrollView() 
scrollView.documentView = collectionView 
view.addSubview(scrollView) 

İşte NSCollectionViewItem

class Cell: NSCollectionViewItem { 
    let label = NSTextField() 
    let imageView = NSImageView() 

    override func loadView() { 
    self.view = NSView() 
    self.view.wantsLayer = true 
    } 
}