带有 cornerRadius 的 UIImageView 被错误地裁剪

UIImageView with cornerRadius is incorrectly cropped

提问人:Danny 提问时间:9/29/2020 更新时间:12/8/2020 访问量:155

问:

我正在尝试添加小高度的矩形(7pt)。 在右侧被错误地裁剪。cornerRadiusUIImageViewUIImageViewenter image description here

奇怪的是,左边是完美的圆形,但同时在右侧有一个额外的白色区域。奇怪的是,它有时会起作用,右角的圆度取决于宽度。如果我将宽度设置为30%以下,右角问题就会消失。UIImageViewUIImageView

我尝试了什么: 只需通过 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

结果总是一样的。 此外,如果我从中删除图像并仅设置为一些随机颜色来测试它,那么右侧的圆角就可以完美运行。UIImageViewbackgroundColor

它可能是什么?

iOS Objective-C Swift UIImageView 角Radius

评论

2赞 matt 9/29/2020
时机就是一切。你什么时候这样做?
0赞 Danny 9/29/2020
@matt我在内部或之后尝试过override func layoutSubviews()
1赞 matt 9/29/2020
好吧,这仍然不是一个最小的可重复示例。请提供我们重问题所需的一切(仅此而已)。
0赞 Feridun Erbaş 9/29/2020
请附上接口生成器 ss

答:

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