有没有办法在 Swift 中以编程方式设置 NSCollectionView?
Is there a way to set up a NSCollectionView programmatically in Swift?
我来自 iOS 开发,我想知道是否有一种方法可以像 iOS 中的 UICollectionView
一样以编程方式设置 NSCollectionView
?并在代码中添加 NSCollectionViewItems
。还是设置 NSCollectionView
以使用绑定的唯一方法?
谢谢!
感谢@stevesliva 将我指向 this SO answer。我将它转换为 Swift。
这就是我得到的。
我正在 ViewController:
中创建一个 NSCollectionView
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!)
}
}
在 ViewController 中创建的 CollectionViewItem 只是加载一个视图,我在其中设置项目视图本身。
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!
}
}
视图本身:
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
}
}
为了设置按钮标题,我使用了一种 hack。 (ViewController中的for-loop)如果有更好的标题设置方法欢迎大家留言。
对于 Swift 2.0,您需要将 collectionView!.autoresizingMask
行更改为:
长手:
collectionView?.autoresizingMask = NSAutoresizingMaskOptions([NSAutoresizingMaskOptions.ViewWidthSizable,NSAutoresizingMaskOptions.ViewMaxXMargin,NSAutoresizingMaskOptions.ViewMinYMargin,NSAutoresizingMaskOptions.ViewHeightSizable,NSAutoresizingMaskOptions.ViewMaxYMargin])
或简称:
collectionView?.autoresizingMask = NSAutoresizingMaskOptions([.ViewWidthSizable,.ViewMaxXMargin,.ViewMinYMargin,.ViewHeightSizable,.ViewMaxYMargin])
您需要在 NSScrollView
中嵌入 NSCollectionView
。下面的代码在 Swift 4
设置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")
)
设置NSScrollView
scrollView = NSScrollView()
scrollView.documentView = collectionView
view.addSubview(scrollView)
这是一个简单的 NSCollectionViewItem
class Cell: NSCollectionViewItem {
let label = NSTextField()
let imageView = NSImageView()
override func loadView() {
self.view = NSView()
self.view.wantsLayer = true
}
}
我来自 iOS 开发,我想知道是否有一种方法可以像 iOS 中的 UICollectionView
一样以编程方式设置 NSCollectionView
?并在代码中添加 NSCollectionViewItems
。还是设置 NSCollectionView
以使用绑定的唯一方法?
谢谢!
感谢@stevesliva 将我指向 this SO answer。我将它转换为 Swift。 这就是我得到的。
我正在 ViewController:
中创建一个 NSCollectionViewimport 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!)
}
}
在 ViewController 中创建的 CollectionViewItem 只是加载一个视图,我在其中设置项目视图本身。
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!
}
}
视图本身:
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
}
}
为了设置按钮标题,我使用了一种 hack。 (ViewController中的for-loop)如果有更好的标题设置方法欢迎大家留言。
对于 Swift 2.0,您需要将 collectionView!.autoresizingMask
行更改为:
长手:
collectionView?.autoresizingMask = NSAutoresizingMaskOptions([NSAutoresizingMaskOptions.ViewWidthSizable,NSAutoresizingMaskOptions.ViewMaxXMargin,NSAutoresizingMaskOptions.ViewMinYMargin,NSAutoresizingMaskOptions.ViewHeightSizable,NSAutoresizingMaskOptions.ViewMaxYMargin])
或简称:
collectionView?.autoresizingMask = NSAutoresizingMaskOptions([.ViewWidthSizable,.ViewMaxXMargin,.ViewMinYMargin,.ViewHeightSizable,.ViewMaxYMargin])
您需要在 NSScrollView
中嵌入 NSCollectionView
。下面的代码在 Swift 4
设置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")
)
设置NSScrollView
scrollView = NSScrollView()
scrollView.documentView = collectionView
view.addSubview(scrollView)
这是一个简单的 NSCollectionViewItem
class Cell: NSCollectionViewItem {
let label = NSTextField()
let imageView = NSImageView()
override func loadView() {
self.view = NSView()
self.view.wantsLayer = true
}
}