- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试设置一个带有 UICollectionViewFlowLayout 的 UICollectionView,并满足以下要求:minimumLineSpacing 应该始终正好是三分之一UICollectionView 的高度。我最初的想法是像这样覆盖 viewDidLayoutSubviews:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionViewFlowLayout.minimumLineSpacing = collectionView.frame.height / 3
collectionViewFlowLayout.invalidateLayout()
}
请注意,我使用 viewDidLayoutSubviews 是因为我打算使用自动布局,并且框架可能取决于一些复杂的约束。所以我无法自己计算框架,必须等到 Auto Layout 计算出来,我才能在 viewDidLayoutSubviews 中使用它。
我通过以编程方式创建 UICollectionView(并旋转模拟器以查看 minimumLineSpacing 是否始终正确)对此进行了一些测试。它似乎工作得很好。
然后,我切换到自动布局。我只是将 Collection View 的顶部、底部、前导和尾随空间限制到它的父 View 。这样做之后,设置 minimumLineSpacing 不再有预期的效果,它根本没有改变 Collection View 的外观。
下面的代码很好地演示了这个问题。一旦我将 useAutoLayout
设置为 true
,设置 minimumLineSpacing 就不再起作用了。
class DemoViewController: UIViewController, UICollectionViewDataSource {
var collectionView: UICollectionView!
var collectionViewFlowLayout: UICollectionViewFlowLayout!
// MARK: - UIViewController
override func viewDidLoad() {
super.viewDidLoad()
collectionViewFlowLayout = UICollectionViewFlowLayout()
collectionViewFlowLayout.itemSize = CGSizeMake(100, 100)
collectionView = UICollectionView(frame: view.frame, collectionViewLayout: collectionViewFlowLayout)
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
collectionView.dataSource = self
view.addSubview(collectionView)
let useAutoLayout = false // Change this to true to test!
if useAutoLayout {
collectionView.setTranslatesAutoresizingMaskIntoConstraints(false)
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[collectionView]-|", options: nil, metrics: nil, views: ["collectionView" : collectionView]))
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[collectionView]-|", options: nil, metrics: nil, views: ["collectionView" : collectionView]))
} else {
collectionView.autoresizingMask = .FlexibleHeight | .FlexibleWidth
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionViewFlowLayout.minimumLineSpacing = collectionView.frame.height / 3
collectionViewFlowLayout.invalidateLayout()
}
// MARK: - <UICollectionViewDataSource>
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 100
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! UICollectionViewCell
cell.backgroundColor = UIColor.greenColor()
return cell
}
}
在模拟器中测试这段代码,旋转它,看看当 useAutoLayout
设置为 true
时,设置 minimumLineSpacing 没有任何作用.所以我的问题是:如何使用自动布局并仍然提供 minimumLineSpacing?
注意事项
Base SDK 设置为 iOS 8.4 SDK。设置其他属性,如 itemSize
或 minimumInteritemSpacing
也不起作用。
最佳答案
我已经复制了你描述的内容。这很奇怪。
我认为在这种情况下,旋转会导致 invalidLayout()
被忽略。也许问题在于您对 invalidateLayout()
的调用发生在布局对象认为它已经响应或正在响应由旋转和自动产生的布局失效的位置 Collection View 的随之而来的边界变化。然后您的失效将被忽略,因为它来不及合并到自动失效中,而且太早无法算作单独的失效。我正在猜测。我注意到您甚至可以在那里继续递增 minimumLineSpacing
,并且它会愉快地前进到无穷大,而无需 Collection View 再次进行布局。
但是如果您设置 View Controller 以便摇动事件触发失效,那么它会注意到该值。
因此,您可以通过强制在运行循环的下一轮发生失效来解决问题,从而避免在循环期间阻止它的任何奇怪的特殊逻辑。例如,如果您将 viewDidLayoutSubviews()
替换为以下内容:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let newValue = collectionView.bounds.height / 3
dispatch_async(dispatch_get_main_queue()) {
[weak collectionViewFlowLayout] in
collectionViewFlowLayout?.minimumLineSpacing = newValue
}
然后就可以了。
为什么这是必要的?我不知道。我认为没有必要。这对我来说就像是 UICollectionView
中的错误,或者至少是一个非常不直观的 API。
关于ios - 使用自动布局时设置 UICollectionViewFlowLayout 的属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127890/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!