web-dev-qa-db-ja.com

imageViewのコーナー半径を設定するにはどうすればよいですか?

Objective-Cでは、このような行

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0f;

その仕事をします、私はSwiftでそれを試しました

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0

そして、それは何も変えません、コーナーは以前と同じです。さらに、Xcodeは構文エラーを表示しません。 Swiftは、この目標を達成する他の方法をサポートしていますか?ここで他のスレッドをいくつか確認しましたが、通常は上記の方法でSwiftで行われています。

60
DCDC

レイヤーはクリップ領域から描画されます。境界にマスクするように設定する必要があります。

self.mainImageView.layer.masksToBounds = true

docs から:

デフォルトでは、角の半径はレイヤーのコンテンツプロパティの画像には適用されません。背景色とレイヤーの境界線にのみ適用されます。ただし、masksToBoundsプロパティをtrueに設定すると、コンテンツは丸い角にクリップされます

148
DarthMike

Swift 3.Xcode8には1つの小さな違いがあります

コーナー半径をUIViewに適用する場合は、cornerRadiusを呼び出す前に必ずyourUIView.layoutIfNeeded()を呼び出してください。

それ以外の場合、UIViewの高さと幅のデフォルト値(1000.0)が返され、おそらくビューが消えます。

レイヤープロパティを設定する前に、UIViewのサイズを変更するすべての効果(インターフェイスビルダーの制約など)が必ず適用されるようにしてください。

IViewクラスの実装例

class BadgeView: UIView {

  override func awakeFromNib() {

    self.layoutIfNeeded()
    layer.cornerRadius = self.frame.height / 2.0
    layer.masksToBounds = true

   }
 }
27
DCDC

「ユーザー定義のランタイム属性」を提供するビューの境界半径を定義できます。タイプ文字列のキーパス「layer.cornerRadius」を提供し、必要な半径の値を提供します;)以下の添付画像を参照してください。

Configuring in XCode

Result in emulator

14
Marcelo Tadeu

これを試して

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
14
Anbu.Karthik

Swift 3の '​​CGRectGetWidth'はプロパティ 'CGRect.width'に置き換えられました

    view.layer.cornerRadius = view.frame.width/4.0
    view.clipsToBounds = true
5

Swift(またはObjective-CのIBInspectable)で@IBInspectableとマークされているため、Interface Builderの属性インスペクターパネルで簡単に編集できます。
直接設定できるborderWidthcornerRadiusborderColor属性インスペクターで

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }

  @IBInspectable var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
  }

  @IBInspectable var borderColor: UIColor? {
    get {
        return UIColor(cgColor: layer.borderColor!)
    }
    set {
        layer.borderColor = borderColor?.cgColor
    }
  }
}

enter image description here

5

Swift 3、Xcode 8、iOS 10

DispatchQueue.main.async {
  self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
  self.mainImageView.clipsToBounds = true
}
5
Gaurav Rami

特定の角を丸くできるUIView拡張を作成しました:

import UIKit

enum RoundType {
    case top
    case none
    case bottom
    case both
}

extension UIView {

    func round(with type: RoundType, radius: CGFloat = 3.0) {
        var corners: UIRectCorner

        switch type {
        case .top:
            corners = [.topLeft, .topRight]
        case .none:
            corners = []
        case .bottom:
            corners = [.bottomLeft, .bottomRight]
        case .both:
            corners = [.allCorners]
        }

        DispatchQueue.main.async {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }

}
3
fredericdnd

最も簡単な方法は、UIImageViewサブクラスを作成することです(試してみましたが、iPhone 7およびXCode 8で完全に機能しています)。

class CIRoundedImageView: UIImageView {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func awakeFromNib() {

        self.layoutIfNeeded()
        layer.cornerRadius = self.frame.height / 2.0
        layer.masksToBounds = true
    }
}

そして、境界線を設定することもできます:

imageView.layer.borderWidth = 2.0

imageView.layer.borderColor = UIColor.blackColor().CGColor
3
Claudia Fitero