我最近遇到了一个恼人的问题.
假设我想在我的应用程序中的多个位置使用图像,并且在任何地方都必须将其舍入为圆形.因为我想我的代码是干净的,我认为这个功能(舍入本身)应放在内部延伸的UIImageView类.我创建了一个简单的类来覆盖storyboard构造函数,并负责正确设置cornerRadius:
class RoundedImageView: UIImageView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width/2
self.layer.borderColor = UIColor.redColor().CGColor
self.layer.borderWidth = 2
self.layer.masksToBounds = true
}
}
Run Code Online (Sandbox Code Playgroud)
对于喜欢的约束
身高:100
这显然有效,因为在调用构造函数后框架不会更改(因为它在storyboard中具有正确的尺寸).例如,当约束看起来像这样时,就会出现问题:
宽度等于0.5 superview的
因为在调用构造函数后框架会发生变化.
我最终做的是这样的:
override func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
myRoundedImageInstance.layer.cornerRadius = ...
}
Run Code Online (Sandbox Code Playgroud)
在每个视图控制器中都有这个类的实例......这是有效的,因为在imageView改变维度之后重新计算框架,但这很难看,在这种情况下似乎没有类的存在.
我尝试将frame的重新计算放在drawRect中 - 也不起作用.有任何想法吗?
这是一个简单的IBDesignable示例(您可以在界面构建器中看到它的样子)
@IBDesignable
class RoundedUIImageView: UIImageView {
@IBInspectable var round: Bool = true {
didSet {
self.clipsToBounds = true
self.layer.cornerRadius = self.frame.width / 2
self.layer.borderWidth = 2.5
self.layer.borderColor = UIColor(rgba: "#D0D0D0").CGColor
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使它更复杂,因为这假设UIImageView是一个正方形.如果不是,它将最终成为一个椭圆.您可以计算最小尺寸,然后剪切.但这是你想要做的最简单的形式.
编辑:相同的想法,但代码更精致.
import UIKit
@IBDesignable
class RoundedUIImageView: UIImageView {
@IBInspectable var round: Bool = true {
didSet { self.setNeedsLayout() }
}
@IBInspectable var width: CGFloat = 2.5 {
didSet { self.setNeedsLayout() }
}
@IBInspectable var color: UIColor = UIColor(rgba: "#D0D0D0") {
didSet { self.setNeedsLayout() }
}
override func layoutSubviews() {
super.layoutSubviews()
self.clipsToBounds = true
if round {
self.layer.cornerRadius = self.frame.width / 2
} else {
self.layer.cornerRadius = 0
}
self.layer.borderWidth = self.width
self.layer.borderColor = self.color.CGColor
}
}
Run Code Online (Sandbox Code Playgroud)
它有默认值,所以一切都可以保持一致.但它也可以通过故事板进行定制.
| 归档时间: |
|
| 查看次数: |
1130 次 |
| 最近记录: |