2016-09-21 24 views
2

当我使用“用户定义的运行属性”时,我很难得到投影阴影。使用用户定义的运行属性的UIView阴影

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

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 
} 

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

enter image description here

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

这是因为颜色属性是一个UIColor和shadowColor期望一个CGColor?

+0

注意的是有点混乱,对于一个UILabel的 “.shadowColor” 的确只是一个的UIColor(!!!!!!!!!!),这样你就可以只使用udra! – Fattie

回答

5

确实如您所述,因为用户定义的运行属性面板中的Color类型创建了UIColor,但layer.borderColor保留了cgColor类型。

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

     get { 
      return UIColor(cgColor: self.borderColor!) 
     } 
    } 
} 

但好得多的办法是使用IBDesignable的代替用户自定义运行属性

你可以通过创建一个类,允许代理的颜色,通过界面生成器设置解决了这个,这更清楚。

您可以通过在项目中添加一个名为UIViewExtentions.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中的每一个按钮,ImageView的,标签等实用工具面板>属性检查器:

enter image description here

现在,如果你在属性检查器中设置你的价值观和回头看看用户自定义属性运行时,你会看到他们是部门自动化cally为你提出!

编辑: 有关详细信息,请参见:http://nshipster.com/ibinspectable-ibdesignable/

+1

我只想评论一下,这对我来说非常合适。而且我对将来可以使用它的可能性感到兴奋。你也帮助我最终了解扩展的力量。但有一个问题,我的更改是否应该在main.storyboard中生效,或者仅在我运行该应用程序时才生效。目前我看到他们在跑步,而不是在故事板上。 –

+1

我很高兴能够提供帮助:)现在,当您扩展现有的控件时,属性不会实时呈现,而只会在您运行应用程序时呈现。目前,@IBDesignable和@IBInspectable实时渲染仅支持使用类class CustomButton的自定义控件:UIButton @IBInspectable var highlightedBackgroundColor:UIColor? { } }' –