在Swift 4中实现UIView的圆角

12

在Swift 3中,我可以这样做来使我的UIView的角变圆:

import UIKit

@IBDesignable
class DesignableView: UIView {
}

extension UIView {

    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
}

在Storyboard中,我可以轻松更改这个:

属性

目前,在设计界面中出现“构建失败”,但我不知道原因。我使用的是Swift 4和Xcode 9。

为什么它在Swift 4中不能正常工作?


什么问题?一切都正常工作。 - Gagan_iOS
1
请提供足够的代码,以便我们能够重现该问题。 - matt
@matt 我已经更新了代码,并添加了一个描述性图像,展示我在Xcode 8和Swift 3中使用的内容。 - Jonathan Solorzano
但它不能让我们重现这个“问题”。你展示的东西运行良好。(在一个简单的新项目中尝试一下。但请不要为此使用“扩展”)问题出在其他地方,而你没有展示它。 - matt
抱歉发布问题,一切都正常,我有一个图像视图让我认为UIView没有更新,但实际上这只是一个视觉效果。 - Jonathan Solorzano
4个回答

32

我已经尝试过你的代码,在iOS 11.1和Swift 4.0上运行良好。(如你所提到的,它向你显示一个错误,但对我来说没有显示任何错误)

@IBDesignable
class RoundUIView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

}

这是结果

在此输入图像描述


更新:
即使您的更新代码也可以正常工作。

@IBDesignable
class DesignableView: UIView {
}

extension UIView {

    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
}

以下是它的结果:

输入图像描述


5
有时候需要提供证据来向问题的提出者证明代码是有效的。我认为这个答案非常合理。 - matt
6
@rmaddy:好的,但我并不在意。他说他要说的话,我说我的话。Servy不是法律,而且与此同时,我们在实地试图向提问者证明他们没有提供可复现的情况。如果你真的感觉非常强烈,可以标记答案,或者给它点个踩。 - matt
1
@Krunal 模块名称并不重要;他有一个模块名称,但他在屏幕截图中将其屏蔽了,因为他不想让我们知道它是什么(仔细看,你会看到擦除的证据)。 - matt
1
谢谢!完美的解决方案。我们如何为 UISearchbar 做到这一点? - Faizan Mubasher
@FaizanMubasher - 提出一个新问题,包括你的确切需求和示例代码,如何在界面中添加搜索栏。我一定会帮助你解决问题。 - Krunal
显示剩余2条评论

2

这个解决方案对我来说在Swift 5中可以得到圆角UIView。

view.layer.cornerRadius = 10;
view.clipsToBounds  =  true

1

{{链接1:Swift}}

public func RoundFrameBackground(_ aView: UIView!, borderWidth: CGFloat!, cornerRadius: CGFloat!, borderColor: UIColor, backgroundColor: UIColor) {
    aView.layer.borderWidth = borderWidth ; aView.layer.borderColor = borderColor.cgColor
    aView.backgroundColor = backgroundColor ; aView.clipsToBounds = true
    aView.layer.cornerRadius = cornerRadius
}

public func RoundFrameOnly(_ aView: UIView!, cornerRadius: CGFloat!) {
    aView.clipsToBounds = true
    aView.layer.cornerRadius = cornerRadius
}

使用:

RoundFrameBackground(*a view*, borderWidth: 1, cornerRadius: 10, borderColor: UIColor.red, backgroundColor: UIColor.blue)

RoundFrameOnly(*a view*, cornerRadius: 10)

0

不是在启动屏幕上。 - Jonathan Solorzano
你能分享更多关于构建错误的信息吗?打开报告导航器可以查看详细的消息。 - jvrmed
没有应用程序构建错误,这是一个可设计构建错误,它不会阻止应用程序运行。 - Jonathan Solorzano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接