2015-11-18 29 views
2

我想用AutoLayout以編程方式創建UICollectionView,並且出現了一些問題。使用AutoLayout以編程方式創建UICollectionView

第一個測試:

在我第一次嘗試我創建了一個UICollectionView作爲一個懶惰的VAR和補充它在viewDidLoad中是這樣的:

lazy var collection: UICollectionView = { 
     let cv = UICollectionView() 
     cv.translatesAutoresizingMaskIntoConstraints = false 
     cv.setCollectionViewLayout(self.flowLayout, animated: true) 
     cv.dataSource = self 
     cv.delegate = self 
     cv.registerClass(MyViewCell.self, forCellWithReuseIdentifier: "cell") 
     return cv 
}() 


override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.addSubview(self.collection) 
} 

這approuch帶我到這個錯誤:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter'

第二個測試:

所以我不得不使用幀/ collectionViewLayout初始化和我的第二次嘗試是這樣的:

lazy var collection: UICollectionView = { 
     let cv = UICollectionView(frame: UIScreen.mainScreen().bounds, collectionViewLayout: self.flowLayout) 
     cv.translatesAutoresizingMaskIntoConstraints = false 
     cv.setCollectionViewLayout(self.flowLayout, animated: true) 
     cv.dataSource = self 
     cv.delegate = self 
     cv.registerClass(MenuViewCell.self, forCellWithReuseIdentifier: "cell") 
     return cv 
}() 


override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.addSubview(self.collection) 

     //Constraints was there... 

} 

有了這個approuch我得到一個空白屏幕,使用調試器,我發現,在數據源委託方法是所謂的(numberOfItemsInSectionnumberOfSectionsInCollectionView),但沒有其他委託方法被調用(sizeForItemAtIndexPathcellForItemAtIndexPath

所以我決定擺脫的autoLayout的和看到的東西的工作方式。

第三個測試:

lazy var collection: UICollectionView = { 
     let cv = UICollectionView(frame: UIScreen.mainScreen().bounds, collectionViewLayout: self.flowLayout) 
     // cv.translatesAutoresizingMaskIntoConstraints = false 
     cv.setCollectionViewLayout(self.flowLayout, animated: true) 
     cv.dataSource = self 
     cv.delegate = self 
     cv.registerClass(MenuViewCell.self, forCellWithReuseIdentifier: "cell") 
     return cv 
    }() 


override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.addSubview(self.collection) 

     //No more constraints here !!! 

} 

,一切工作正常。

所以,我的問題是:有沒有辦法用AutoLayout以編程方式使用UICollectionView?

SOLUTION

一段時間後,我發現我的問題是在約束。然後我出來這個解決方案:

let slice = (UIScreen.mainScreen().bounds.height/CGFloat(3.0)) 

    lazy var flowLayout:UICollectionViewFlowLayout = { 
     let f = UICollectionViewFlowLayout() 
     f.scrollDirection = UICollectionViewScrollDirection.Horizontal 
     return f 
    }() 


    lazy var collection: UICollectionView = { 
     let cv = UICollectionView(frame: CGRectZero, collectionViewLayout: self.flowLayout) 
     cv.translatesAutoresizingMaskIntoConstraints = false 
     cv.setCollectionViewLayout(self.flowLayout, animated: true) 
     cv.dataSource = self 
     cv.delegate = self 
     cv.registerClass(MenuViewCell.self, forCellWithReuseIdentifier: "cell") 
     return cv 
    }() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.addSubview(self.collection) 

     let views = ["collection":self.collection] 

     var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[collection]-0-|", options: NSLayoutFormatOptions.AlignAllTop, metrics: nil, views: views) 
     self.view.addConstraints(constraints) 

     constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-\(slice)-[collection]-\(slice)-|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: views) 
     self.view.addConstraints(constraints) 
    } 
+0

輝煌,非常感謝 –

回答

2

過了一段時間,我發現我的問題是在約束。然後我出來了這個解決方案:

let slice = (UIScreen.mainScreen().bounds.height/CGFloat(3.0)) 

    lazy var flowLayout:UICollectionViewFlowLayout = { 
     let f = UICollectionViewFlowLayout() 
     f.scrollDirection = UICollectionViewScrollDirection.Horizontal 
     return f 
    }() 


    lazy var collection: UICollectionView = { 
     let cv = UICollectionView(frame: CGRectZero, collectionViewLayout: self.flowLayout) 
     cv.translatesAutoresizingMaskIntoConstraints = false 
     cv.setCollectionViewLayout(self.flowLayout, animated: true) 
     cv.dataSource = self 
     cv.delegate = self 
     cv.registerClass(MenuViewCell.self, forCellWithReuseIdentifier: "cell") 
     return cv 
    }() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.addSubview(self.collection) 

     let views = ["collection":self.collection] 

     var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[collection]-0-|", options: NSLayoutFormatOptions.AlignAllTop, metrics: nil, views: views) 
     self.view.addConstraints(constraints) 

     let stringConstraint = "V:|-\(slice)-[collection]-\(slice)-|" 

     print("stringConstraint: \(stringConstraint)") 

     constraints = NSLayoutConstraint.constraintsWithVisualFormat(stringConstraint, options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: views) 
     self.view.addConstraints(constraints) 
    } 
相關問題