iOS collectionView.sizeForItemAtIndexPath 在 iPhone 6 之前的任何东西上都会中断
Posted
技术标签:
【中文标题】iOS collectionView.sizeForItemAtIndexPath 在 iPhone 6 之前的任何东西上都会中断【英文标题】:iOS collectionView.sizeForItemAtIndexPath Breaks On Anything Before iPhone 6 【发布时间】:2015-04-21 22:55:57 【问题描述】:我是 ios 开发的新手,我正在尝试将我在 android 上的项目移植到 iOS。我正在尝试在代码中构建一个 collectionView 作为实现的一部分。问题是集合视图中每个单元格中的数据可以是不同的字符串大小,每个单元格可以与其邻居的大小不同。我正在试验附加的代码,但我注意到使用 iPhone 6 无论是物理设备还是在模拟器中,UI 看起来都符合预期......其他任何东西看起来都非常糟糕。似乎是 sizeForIndexItemAtPath 打破了它。有什么想法吗? TIA
import UIKit
class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource
var collectionView: UICollectionView?
var thisCellHeight: CGFloat = 0.0
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screenSize.width
let screenHeight = screenSize.height
var thisWidth = screenWidth - 10
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 70, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: thisWidth, height: 120)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
//collectionView!.backgroundView?.backgroundColor = UIColor.blueColor()
collectionView!.dataSource = self
collectionView!.delegate = self
collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
collectionView!.backgroundColor = hexStringToUIColor("#15ADFF")
self.view.addSubview(collectionView!)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 14
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell
cell.backgroundColor = UIColor.whiteColor()
var typeLabel = UILabel(frame: CGRectMake(10, 0, 200, 21))
typeLabel.text = "Card Type"
typeLabel.font = typeLabel.font.fontWithSize(20)
cell.addSubview(typeLabel)
var titleLabel = UILabel(frame: CGRectMake(10, 25, 300, 21))
titleLabel.text = "This Is The Article Title. This Is The Article Title. This Is The Article Title. This Is The Article Title."
titleLabel.font = titleLabel.font.fontWithSize(20)
titleLabel.numberOfLines = 0
titleLabel.sizeToFit()
self.thisCellHeight = CGFloat(titleLabel.frame.height)
println("The title text is \(self.thisCellHeight) high")
cell.addSubview(titleLabel)
var authorLabel = UILabel(frame: CGRectMake(10, thisCellHeight + 30, 200, 21))
authorLabel.text = "This Is The Article Author"
authorLabel.font = authorLabel.font.fontWithSize(15)
cell.addSubview(authorLabel)
var timestampLabel = UILabel(frame: CGRectMake(10, thisCellHeight + 50, 200, 21))
timestampLabel.text = "This Is The Timestamp"
timestampLabel.font = timestampLabel.font.fontWithSize(15)
cell.addSubview(timestampLabel)
return cell
func hexStringToUIColor (hex:String) -> UIColor
var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString
if (cString.hasPrefix("#"))
cString = cString.substringFromIndex(advance(cString.startIndex, 1))
if (countElements(cString) != 6)
return UIColor.grayColor()
var rgbValue:UInt32 = 0
NSScanner(string: cString).scanHexInt(&rgbValue)
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
return CGSizeMake(320, 350)
【问题讨论】:
您能解释一下(可能是屏幕截图)您的预期与您所看到的吗? 好吧,你会相信吗...我昨晚很晚才开始工作,今天就放弃了。我刚刚打开 Xcode 来截屏,现在代码正在运行...... 我在你睡觉的时候修好了。我写这条评论是为了提示你打开 Xcode。 伙计,你救了我。非常感谢! 我不明白 - 这是如何解决的?通过打开和关闭 xCode?span> 【参考方案1】:您将布局上的项目大小设置为:
layout.itemSize = CGSize(width: thisWidth, height: 120)
而且你也在使用委托方法
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
return CGSizeMake(320, 350)
第一个被第二个覆盖。 layout.itemSize
是每个项目的默认大小,如果委托方法 sizeForItemAtIndexPath
没有被覆盖。您正在用看起来完全不同的东西覆盖layout.itemSize
。尝试只删除委托函数sizeForItemAtIndexPath
,这是否符合您的预期?
【讨论】:
以上是关于iOS collectionView.sizeForItemAtIndexPath 在 iPhone 6 之前的任何东西上都会中断的主要内容,如果未能解决你的问题,请参考以下文章