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

Posted

技术标签:

【中文标题】使用用户定义的运行时属性的 UIView 阴影【英文标题】:UIView Shadow using User Defined Runtime Attributes 【发布时间】:2016-09-21 22:54:21 【问题描述】:

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

如果我使用代码,它似乎完全可以正常工作,如下所示。

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 属性,那么它似乎又可以工作了。但是我不能再控制颜色了。它似乎默认为黑色,但如果我决定选择灰色,我将无法更改它。

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

【问题讨论】:

请注意,有点令人困惑的是,对于 UILabel,“.shadowColor”确实只是一个 UIColor (!!!!!!!!!!) 所以你可以只使用 u.d.r.a !!! 【参考方案1】:

确实如您所说,因为用户定义的运行时属性面板中的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
        
    

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

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

编辑: 更多内容见:http://nshipster.com/ibinspectable-ibdesignable/

【讨论】:

我只是想评论一下,这对我来说非常有效。我对将来可以使用它的可能性感到兴奋。您还帮助我最终了解了扩展的力量。不过有一个问题,我的更改应该在 main.storyboard 中生效还是仅在我运行应用程序时生效。目前我看到他们正在运行,只是没有在故事板上。 我很高兴能帮上忙 :) 现在,当您扩展现有控件时,属性不会实时呈现,而只会在您运行应用程序时呈现。目前,@IBDesignable 和@IBInspectable 实时渲染仅支持使用class CustomButton: UIButton @IBInspectable var highlightedBackgroundColor:UIColor? 等子类的自定义控件@

以上是关于使用用户定义的运行时属性的 UIView 阴影的主要内容,如果未能解决你的问题,请参考以下文章

使用用户定义的运行时属性的行距

使用用户定义的运行时属性让应用程序崩溃

保留蒙面 UIView 的阴影

使用用户定义的运行时属性设置 defaultTextAttributes?

拖动带有阴影的自定义 UIView - 大小重置和阴影消失

用户定义的运行时属性导致来自 xib 的 EXC_BAD_ACCESS