如何设置imageView的圆角半径?
How to set corner radius of 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 中完成的。
图层绘制出裁剪区域,需要设置遮罩到边界:
self.mainImageView.layer.masksToBounds = true
来自docs:
By default, the corner radius does not apply to the image in the
layer’s contents property; it applies only to the background color and
border of the layer. However, setting the masksToBounds property to
true causes the content to be clipped to the rounded corners
试试这个
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 3.0 和 Xcode8
有一个微小的区别
每当你想将圆角半径应用于 UIView 时,请确保调用
yourUIView.layoutIfNeeded()
在调用 cornerRadius
.
之前
否则,它将 return UIView 的高度和宽度的默认值 (1000.0),这可能会使您的视图消失。
始终确保在设置任何层属性之前应用所有更改 UIView 大小的效果(界面构建器约束等)。
UIView 示例class 实现
class BadgeView: UIView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
Swift3,Xcode8,iOS10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
最简单的方法是创建一个 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
在 swift 中标记为 @IBInspectable
(或在 Objective-C 中标记为 IBInspectable),它们可以在 Interface Builder 的属性检查器面板中轻松编辑。
可以直接在attributes inspector
中设置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
}
}
}
您可以定义任何视图的边界半径,提供 "User defined Runtime Attributes",提供字符串类型的关键路径 "layer.cornerRadius",然后提供您需要的半径值 ;)
请参阅下面的附图:
我创建了一个 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
}
}
}
import UIKit
class BorderImage: UIImageView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 10.0
layer.masksToBounds = true
}
}
基于@DCDC 的回答
在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:
By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to true causes the content to be clipped to the rounded corners
试试这个
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 3.0 和 Xcode8
有一个微小的区别每当你想将圆角半径应用于 UIView 时,请确保调用
yourUIView.layoutIfNeeded()
在调用 cornerRadius
.
否则,它将 return UIView 的高度和宽度的默认值 (1000.0),这可能会使您的视图消失。
始终确保在设置任何层属性之前应用所有更改 UIView 大小的效果(界面构建器约束等)。
UIView 示例class 实现
class BadgeView: UIView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
Swift3,Xcode8,iOS10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
最简单的方法是创建一个 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
在 swift 中标记为 @IBInspectable
(或在 Objective-C 中标记为 IBInspectable),它们可以在 Interface Builder 的属性检查器面板中轻松编辑。
可以直接在attributes inspector
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
}
}
}
您可以定义任何视图的边界半径,提供 "User defined Runtime Attributes",提供字符串类型的关键路径 "layer.cornerRadius",然后提供您需要的半径值 ;) 请参阅下面的附图:
我创建了一个 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
}
}
}
import UIKit
class BorderImage: UIImageView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 10.0
layer.masksToBounds = true
}
}
基于@DCDC 的回答