swift - 使用@IBInspectable Swift 4.2 的 UIView 上的 CornerRadius 和阴影
问题描述
是否可以在a 上同时拥有CornerRaduis
和阴影UIView
?
我为 a 设置了一个自定义类,用于UIView
设置@IBInspectable
acornerRadius
和 aaddShadow
可以是true
or false
。当我设置cornerRadius
阴影不显示时,如果我拿走cornerRadius
它,它会再次显示。提前致谢!
自定义类:
import UIKit
class CustomUIView: UIView {
override func awakeFromNib() {
self.layer.masksToBounds = cornerRadius > 0
}
@IBInspectable var useDefaultRadius: Bool = true {
didSet {
self.layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
self.layer.cornerRadius = newValue
}
get {
if (useDefaultRadius) {
// Set default radius
self.layer.cornerRadius = 23
}
return self.layer.cornerRadius
}
}
@IBInspectable var addShadow:Bool = true{
didSet(newValue) {
if(newValue == true){
self.layer.masksToBounds = false
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOpacity = 0.5
self.layer.shadowOffset = CGSize(width: 2, height: 3)
self.layer.shadowRadius = 3
self.layer.shadowPath = UIBezierPath(rect: bounds).cgPath
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.main.scale
print("trying to use shadow")
}
}
}
}
解决方案
我更喜欢扩展它,而不是每次都创建自定义类和更改 uiview 类。我通过扩展 UIView 来实现这一点,如下所述:
extension UIView {
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
@IBInspectable
var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable
var borderColor: UIColor? {
get {
let color = UIColor.init(cgColor: layer.borderColor!)
return color
}
set {
layer.borderColor = newValue?.cgColor
}
}
@IBInspectable
var shadowRadius: CGFloat {
get {
return layer.shadowRadius
}
set {
layer.shadowRadius = shadowRadius
}
}
@IBInspectable
var shadowOffset : CGSize{
get{
return layer.shadowOffset
}set{
layer.shadowOffset = newValue
}
}
@IBInspectable
var shadowColor : UIColor{
get{
return UIColor.init(cgColor: layer.shadowColor!)
}
set {
layer.shadowColor = newValue.cgColor
}
}
@IBInspectable
var shadowOpacity : Float {
get{
return layer.shadowOpacity
}
set {
layer.shadowOpacity = newValue
}
}
}
并将情节提要中的属性设置为:
而已。
希望这可以帮助。
推荐阅读
- c# - 如何从图像中的对象获得标准化协调
- python - 如何在使用 Selenium 自动填充 Python 中的 Web 表单时修复“'float' 类型的对象没有 len()”
- c# - 找不到类型或命名空间名称“BluetoothAddress”
- ruby-on-rails - Rails:Capyabra / Selenium Chrome 驱动程序设置
- highcharts - 如何在 highcharts buuble 图表中给出正确的数字面额
- file - 确定一个 CSS 文件是有效的 CSS 文件
- python - 如何根据另一列的最小唯一值对一列进行分组并过滤数据框?
- jquery - 将带有列表对象的 form.serialize 发送到 mvc 控制器
- javascript - 如何查找当前日期和另一个日期之间的时差
- c# - 如何防止在 IO 操作期间由于属性快速变化而阻塞 UI?