带有cornerRadius的UIImageView被错误地裁剪

如何解决带有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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?