使用用户定义的运行时属性的 UIView 阴影
UIView Shadow using User Defined Runtime Attributes
我在使用 "User Defined Runtime Attributes" 时很难显示阴影。
如果我使用代码,它似乎完全可以正常工作,如下所示。
func formatView(view: UIView, cornerRadius: Bool) {
if (cornerRadius) {view.layer.cornerRadius = 12 }
view.layer.shadowColor = UIColor.black.cgColor
view.layer.shadowOffset = CGSize.zero
view.layer.shadowRadius = 3
view.layer.shadowOpacity = 0.3
}
但是当我尝试使用用户定义的运行时属性时,它不再显示了。这些是我目前正在使用的。
唯一奇怪的是,如果我删除 layer.shadowColor
属性,它似乎又可以工作了。但我无法再控制颜色。它似乎默认为黑色,但如果我决定选择灰色,我将无法更改它。
这是因为颜色属性是 UIColor 而 shadowColor 需要 CGColor 吗?
确实如您所说,因为用户定义的运行时属性面板中的 Color
类型创建了一个 UIColor
,但 layer.borderColor
持有一个 cgColor
类型。
您可以通过创建允许通过 Interface Builder 设置代理颜色的类别来解决此问题:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
但是更好的方法是使用IBDesignable而不是User Defined Runtime Attributes,更清晰。
您可以通过在您的项目中添加一个名为 UIViewExtentions.swift 的新 swift 文件来完成此操作(或将其粘贴到任何文件中):
import UIKit
@IBDesignable extension UIView {
@IBInspectable var borderColor:UIColor? {
set {
layer.borderColor = newValue!.cgColor
}
get {
if let color = layer.borderColor {
return UIColor(cgColor:color)
}
else {
return nil
}
}
}
@IBInspectable var borderWidth:CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}
然后这将在实用程序面板 > 属性检查器中的每个按钮、imageView、标签等的 Interface Builder 中可用:
现在,如果您在属性检查器中设置值并回头查看用户定义的运行时属性,您会看到它们已自动为您归档!
编辑:
更多信息,请参阅:http://nshipster.com/ibinspectable-ibdesignable/
我在使用 "User Defined Runtime Attributes" 时很难显示阴影。
如果我使用代码,它似乎完全可以正常工作,如下所示。
func formatView(view: UIView, cornerRadius: Bool) {
if (cornerRadius) {view.layer.cornerRadius = 12 }
view.layer.shadowColor = UIColor.black.cgColor
view.layer.shadowOffset = CGSize.zero
view.layer.shadowRadius = 3
view.layer.shadowOpacity = 0.3
}
但是当我尝试使用用户定义的运行时属性时,它不再显示了。这些是我目前正在使用的。
唯一奇怪的是,如果我删除 layer.shadowColor
属性,它似乎又可以工作了。但我无法再控制颜色。它似乎默认为黑色,但如果我决定选择灰色,我将无法更改它。
这是因为颜色属性是 UIColor 而 shadowColor 需要 CGColor 吗?
确实如您所说,因为用户定义的运行时属性面板中的 Color
类型创建了一个 UIColor
,但 layer.borderColor
持有一个 cgColor
类型。
您可以通过创建允许通过 Interface Builder 设置代理颜色的类别来解决此问题:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
}
但是更好的方法是使用IBDesignable而不是User Defined Runtime Attributes,更清晰。
您可以通过在您的项目中添加一个名为 UIViewExtentions.swift 的新 swift 文件来完成此操作(或将其粘贴到任何文件中):
import UIKit
@IBDesignable extension UIView {
@IBInspectable var borderColor:UIColor? {
set {
layer.borderColor = newValue!.cgColor
}
get {
if let color = layer.borderColor {
return UIColor(cgColor:color)
}
else {
return nil
}
}
}
@IBInspectable var borderWidth:CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}
然后这将在实用程序面板 > 属性检查器中的每个按钮、imageView、标签等的 Interface Builder 中可用:
现在,如果您在属性检查器中设置值并回头查看用户定义的运行时属性,您会看到它们已自动为您归档!
编辑: 更多信息,请参阅:http://nshipster.com/ibinspectable-ibdesignable/