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で行われています。
レイヤーはクリップ領域から描画されます。境界にマスクするように設定する必要があります。
self.mainImageView.layer.masksToBounds = true
docs から:
デフォルトでは、角の半径はレイヤーのコンテンツプロパティの画像には適用されません。背景色とレイヤーの境界線にのみ適用されます。ただし、masksToBoundsプロパティをtrueに設定すると、コンテンツは丸い角にクリップされます
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
}
}
これを試して
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
Swift 3の 'CGRectGetWidth'はプロパティ 'CGRect.width'に置き換えられました
view.layer.cornerRadius = view.frame.width/4.0
view.clipsToBounds = true
Swift(またはObjective-CのIBInspectable)で@IBInspectable
とマークされているため、Interface Builderの属性インスペクターパネルで簡単に編集できます。
直接設定できるborderWidth、cornerRadius、borderColor属性インスペクターで
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
}
}
}
Swift 3、Xcode 8、iOS 10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
特定の角を丸くできる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
}
}
}
最も簡単な方法は、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