如何在 UICollectionView 单元格中获取 UIImageView 的帧大小

Posted

技术标签:

【中文标题】如何在 UICollectionView 单元格中获取 UIImageView 的帧大小【英文标题】:How to get the frame size of a UIImageView in a UICollectionView cell 【发布时间】:2018-06-17 11:51:46 【问题描述】:

我试图在UICollectionViewCell 中获取UIImageView 的帧大小。我目前尝试使用thumbnailImageView.frame.size 来实现这一点,但无论我从哪里调用此方法,它都会返回(0.0, 0.0)

我想这样做的原因是在图像视图中对图像的边缘进行圆角处理,但由于我使用的是.scaleAspectFit,因此我需要知道帧大小和图像大小才能正确圆角。

下面是单元格类:

class SomeCollectionViewCell: UICollectionViewCell 

    override init(frame: CGRect) 
        super.init(frame: frame)
        setupViews()
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    let thumbnailImageView: UIImageView = 
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        return imageView
    ()

    private func setLabel(label: UILabel, textSize: CGFloat = 15.0, textColour: UIColor = UIColor.black) -> UILabel 
        label.textColor = textColour
        label.textAlignment = .center
        label.font = label.font.withSize(textSize)
        return label
    

    var firstLabel: UILabel = UILabel()
    var secondLabel: UILabel = UILabel()
    var thirdLabel: UILabel = UILabel()

    func setupViews() 
        firstLabel = setLabel(label: firstLabel)
        secondLabel = setLabel(label: secondLabel)
        thirdLabel = setLabel(label: thirdLabel)

        addSubview(thumbnailImageView)
        addSubview(firstLabel)
        addSubview(secondLabel)
        addSubview(thirdLabel)

        addConstraintWithFormat(format: "V:|-25-[v0(125)]-[v1(16)]-[v2(16)]-[v3(17)]-25-|", views: thumbnailImageView, firstLabel, secondLabel, thirdLabel)
        addConstraintWithFormat(format: "H:|[v0]|", views: thumbnailImageView)
        addConstraintWithFormat(format: "H:|[v0]|", views: firstLabel)
        addConstraintWithFormat(format: "H:|[v0]|", views: secondLabel)
        addConstraintWithFormat(format: "H:|[v0]|", views: thirdLabel)

    



extension UIView 
    func addConstraintWithFormat(format: String, views: UIView...) -> Void 
        var viewDictionary = [String : UIView]()
        for (index, view) in views.enumerated() 
            let key = "v\(index)"
            viewDictionary[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewDictionary))
    

【问题讨论】:

让 imageViewSize = cell.yourImageView.frame.size @ElTomato 我试过了,它仍然返回 (0.0, 0.0)。 那么要么你的 IBOutlet 对象没有连接,要么你没有讲述整个故事。 我没有使用情节提要。图像在集合视图中正确显示。 尝试在layoutSubviews()中获取frame 【参考方案1】:

所以解决问题的方法是使用这种方法:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 
    

此方法用于告诉委托指定的单元格即将显示在集合视图中,此时,它已被赋予其边界。

【讨论】:

【参考方案2】:

另一种可能性打印(cell.frame.size)

【讨论】:

【参考方案3】:

也许这就是你想要的,试试吧:

print(cell.photo?.image.size)

【讨论】:

不,这会在 aspectRatio 改变之前给出原始图像大小。在 AspectRatiio 更改后,我需要 ImageView 大小来计算新图像的大小。

以上是关于如何在 UICollectionView 单元格中获取 UIImageView 的帧大小的主要内容,如果未能解决你的问题,请参考以下文章

如何从选定的 UICollectionView 单元格中获取数据?

如何使用 Alamofire 在 UICollectionView 单元格中使用标签显示图像?

如何在 uicollectionview 单元格中使用 uibutton 操作并获取单元格的内容

如何在 UICollectionView 单元格中获取 UIImageView 的帧大小

如何删除 UICollectionView 单元格中的单个对象?

每个 UICollectionView 单元格中的 UITableView