使用用户定义的运行时属性的UIView阴影

Jas*_*ady 5 swift3 ios10 xcode8

当我使用"用户定义的运行时属性"时,我很难显示阴影.

如果我使用代码,它似乎完全正常,如下所示.

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
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用用户定义的运行时属性尝试它时,它不再显示.这些是我目前正在使用的.

在此输入图像描述

唯一奇怪的是,如果我删除layer.shadowColor属性,那么它似乎再次起作用.但我无法控制颜色.它似乎默认为黑色,但如果我决定选择灰色,我将无法改变它.

这是因为Color属性是UIColor而shadowColor需要CGColor吗?

jo.*_*.On 11

确实如您所述,因为" Color用户定义的运行时属性"面板中的类型创建了一个类型UIColorlayer.borderColor保留了cgColor类型.

您可以通过创建允许通过Interface Builder设置代理颜色的类别来解决此问题:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但更好的方法是使用IBDesignable而不是用户定义的运行时属性,它更清楚.

您可以通过在项目中添加一个名为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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,这将在Interface Builder中为Utilities面板> Attributes Inspector中的每个按钮,imageView,标签等提供:

在此输入图像描述

现在,如果您在Attributes Inspector中设置值并回顾用户定义的运行时属性,您将看到它们会自动归档给您!

编辑:有关更多信息,请参阅:http://nshipster.com/ibinspectable-ibdesignable/

  • 我只是想回答一下,这对我来说非常合适.而且我对将来可以使用它的可能性感到兴奋.您还帮助我最终了解扩展的强大功能.但是有一个问题,我的更改是否应该在main.storyboard中生效,或者仅在我运行应用程序时生效.目前我在运行中看到它们,而不是在故事板上. (2认同)
  • 我很乐意帮忙:)现在,当您扩展现有控件时,属性不会实时呈现,而是仅在您运行应用程序时呈现.目前,@ IBDesignable和@IBInspectable实时渲染仅支持使用子类的自定义控件,如类CustomButton:UIButton {@IBInspectable var highlightedBackgroundColor:UIColor?{}}` (2认同)