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 之前的任何东西上都会中断的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别