UICollectionViewCell的子视图绝对帧

时间:2016-02-05 04:29:01

标签: swift uiimageview autolayout uicollectionview uicollectionviewcell

我一直认为这个问题很容易解决,但花了很多时间才解决它。

所以,我有一个带有 UICollectionView UIViewController 。这个系列从顶部填充75像素,并且具有非常简单的设置 - 仅1 UIImageView 设置为适合容器的大小。一切都是通过 AutoLayout 制作的。

我的任务是让 UIImageView 全屏显示。我正在做的是制作一个临时的 UIImageView 并添加到 UIViewController 视图的层次结构中。

我面临的问题是我无法在我点击的单元格中获得 UIImageView 的绝对帧。

我尝试了各种方法来计算框架,我最近的尝试是

var rect = cell.imageView.superview!.convertRect(cell.imageView.frame, toView: self.view)

但是,它返回的结果似乎忽略了集合视图顶部约束。

更新

事实证明我的问题是以错误的方式从集合视图中获取单元格。而不是:

let cell = collectionView.cellForItemAtIndexPath(indexPath) as! UIImageCollectionViewCell

我正在接收

let cell = self.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! UIImageCollectionViewCell

这显然导致使用错误的框架创建新单元格。我的坏,深夜编码有时不是最好的。感谢Arun Ammannaya的快速示例

1 个答案:

答案 0 :(得分:1)

我试过的,按预期工作。

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

@IBOutlet var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()

}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    return collectionView.dequeueReusableCellWithReuseIdentifier("aaa", forIndexPath: indexPath)
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 10
}

@IBAction func frame(sender: AnyObject) {

    print(String(sender.frame))

    let rect = sender.superview??.convertRect(sender.frame, toView: self.view)

    print(String(rect))

    let addedView = UIView()
    view.addSubview(addedView)
    addedView.frame = rect!

    addedView.backgroundColor = UIColor.yellowColor()
}

}

故事板看起来像:

Storybord

输出如下:

Output