提问人:Danny 提问时间:9/29/2020 更新时间:12/8/2020 访问量:155
带有 cornerRadius 的 UIImageView 被错误地裁剪
UIImageView with cornerRadius is incorrectly cropped
问:
我正在尝试添加小高度的矩形(7pt)。 在右侧被错误地裁剪。cornerRadius
UIImageView
UIImageView
奇怪的是,左边是完美的圆形,但同时在右侧有一个额外的白色区域。奇怪的是,它有时会起作用,右角的圆度取决于宽度。如果我将宽度设置为30%以下,右角问题就会消失。UIImageView
UIImageView
我尝试了什么: 只需通过 cornerRadius 设置拐角
layer.cornerRadius = frame.size.height / 2
clipsToBounds = true
通过图形上下文设置拐角
func withRoundedCorners(radius: CGFloat, rect: CGRect) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
UIBezierPath(roundedRect: rect, cornerRadius: radius).addClip()
draw(in: rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
通过蒙版和路径设置拐角
extension UIImageView {
func roundCornersForAspectFit(radius: CGFloat) {
if let image = self.image {
// calculate drawingRect
let boundsScale = bounds.size.width / bounds.size.height
let imageScale = image.size.width / image.size.height
var drawingRect: CGRect = bounds
if boundsScale > imageScale {
drawingRect.size.width = drawingRect.size.height * imageScale
drawingRect.origin.x = (bounds.size.width - drawingRect.size.width) / 2
} else {
drawingRect.size.height = drawingRect.size.width / imageScale
drawingRect.origin.y = (bounds.size.height - drawingRect.size.height) / 2
}
let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
}
使用不同类型的图像 contentMode 播放
.scaleAspectFill
or
.scaleAspectFit
or
.scaleToFill
结果总是一样的。
此外,如果我从中删除图像并仅设置为一些随机颜色来测试它,那么右侧的圆角就可以完美运行。UIImageView
backgroundColor
它可能是什么?
答:
0赞
Menaim
12/8/2020
#1
您可以将此扩展添加到您的项目中:
import Foundation
import UIKit
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 {
let color = UIColor(cgColor: layer.borderColor!)
return color
}
set {
layer.borderColor = newValue?.cgColor
}
}
}
然后你可以把它添加到你的viewController中,你可以应用到按钮、标签、imageView等.cornerRadius
imageViewCountryImage.cornerRadius = 15
评论
override func layoutSubviews()