带有cornerRadius的UIImageView被错误地裁剪

问题描述

我正在尝试将cornerRadius添加UIImageView,这是一个高度较小(7pt)的矩形。 UIImageView在右侧被错误地裁剪。

enter image description here

奇怪的是UIImageView的左侧完美地圆了,但同时右侧又有一个额外的白色区域。有时它还起作用也很奇怪,右上角的圆度取决于UIImageView的宽度。如果我将宽度设置为少30%,右上角的问题就会消失。

我尝试了什么: 只需通过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设置为某种随机颜色以对其进行测试,则右侧的圆角效果会很好。

那会是什么?

解决方法

您可以将此扩展添加到您的项目中

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中,并且可以将.cornerRadius应用于按钮,标签,imageViews等

imageViewCountryImage.cornerRadius = 15

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...