web-dev-qa-db-ja.com

swiftのUICollectionViewCellのUIimageに角を丸く設定します

Google、ドキュメント、またはここで解決策を見つけることができないという単純な問題があります。

ビューコントローラーにCollectionviewがあります。 UIImageを含むカスタムセルDescriptionCellを作成しました。この画像の角を丸くしたい。ただし、UIImageレイヤーのコーナー半径をどこに設定するかわかりません。セルのawakeFromNibメソッド、デリゲートメソッドCellForRowAtIndexPathで試し、セルのLayoutSubviewをオーバーライドしましたが、機能しません。 UIImageの半径を設定するコードをどこに配置すればよいですか?

具体的には、UIImageの角を丸くする方法を知っています。しかし、それがCollectionviewセルのサブビューである場合、cornerradiusを設定する場所がわかりません。

これが私のdescriptionCellのコードです

class DescriptionCell: UICollectionViewCell {
    @IBOutlet weak var mImage: UIImageView!

    override func awakeFromNib() {
    //mImage.layer.cornerradius = 5 
    //Does not work, the image is still square in the cell
    }

そして、cellforRowAtIndePath

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("descriptioncell", forIndexPath: indexPath) as! DescriptionCell
    //cell.mImage.layer.cornerradius = 5 
    //Does not work, the image is still square in the cell
return cell    
}

前もって感謝します!

13
Jell92

さて、あなたはあなたが使用していたと答えたコードの一部を使用しています。他の部分はimageView.clipsToBounds = true

次のようにawakeFromNibを更新します。

override func awakeFromNib() {
    mImage.layer.cornerRadius = 5 
    mimage.clipsToBounds = true
}

円にするには、cornerRadiusを正方形の高さの半分に設定する必要があります。 cellForItemAtIndexPathに次の行を追加します。

cell.layoutIfNeeded()
cell.mImage.layer.cornerRadius = cell.mImage.frame.height/2

更新

layoutSubviewsが2回呼び出されないようにするには、layoutSubviewsクラスでDescriptionCellをオーバーライドし、そこにコードを配置します。

override func layoutSubviews() {
    super.layoutSubviews()
    layoutIfNeeded()
    mImage.layer.cornerRadius = mImage.frame.height/2
}
21
Sam_M

カスタムUICollectionViewCellのinit関数内に配置してみましたか?

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

    image.layer.masksToBounds = true
    image.layer.cornerRadius = 10
}
1
Hamer

次のような拡張機能を作成することもできます。

extension UIView {
    func addBorder(color: UIColor, cornerRadius: CGFloat = 10, borderWidth: CGFloat = 1.0) {
        layer.borderWidth = borderWidth;
        layer.borderColor = color.cgColor
        layer.cornerRadius = cornerRadius
        layer.masksToBounds = true
    }
}
0
Breno Prata