【问题标题】:trouble with UIAppearance and UIButton subclassingUIAppearance 和 UIButton 子类化的问题
【发布时间】:2013-08-07 15:28:45
【问题描述】:

我有一个自定义按钮,它只是一个标准的 UIButton,但添加了一个 CAGradientLayer。

在我的自定义按钮中,我定义了两个属性:

@property (nonatomic, strong) UIColor* topColor UI_APPEARANCE_SELECTOR;
@property (nonatomic, strong) UIColor* bottomColor UI_APPEARANCE_SELECTOR;

如果这两个值都设置好了,我的按钮就会用漂亮的线性渐变绘制自己。效果很好。

我也喜欢尽可能多地投入到 InterfaceBuilder 中。因此,在其中一些按钮上,在 IB 的“身份检查器”中,我为这些属性添加了“用户定义的运行时属性”。再次,效果很好。

接下来,我想尝试使用 UIAppearance 代理。我的大多数自定义渐变按钮都具有相同的颜色。但是有一些是不同的。所以,我想我要做的是使用外观代理来设置这个类的默认颜色,然后对于任何不同的按钮,我可以在 IntefaceBuilder 中设置它们的值。这失败了。

显然,发生的事情是它首先从我的故事板文件中读取运行时属性,但随后这些值被外观代理覆盖。我不希望它以这种方式工作,但确实如此。

关于如何做到这一点的任何提示?还是我应该放弃运行时属性?

【问题讨论】:

  • 请出示一些代码!
  • iT -- 这里真的没有代码可以展示。在我的应用程序:didFinishLaunchingWithOptions:launchOptions 例程中,我调用外观代理的“setTopColor”和“setBottomColor”例程,以建立渐变中使用的默认顶部/底部颜色。我遇到的问题是它从我的情节提要中读取属性,设置它们,然后调用外观代理调用,覆盖情节提要中的值。

标签: ios interface-builder uiappearance


【解决方案1】:

好的,我已经考虑过了,我想这确实是 Appearance 代理应该做的。所以,我的解决方案是有两个类“MySpecialButton”和“MyAppearanceButton”。

MyAppearanceButton 将是 MySpecialButton 的子类。

“MyAppearanceButton”的外观将由外观代理调用控制。如果我想要一个不受这种方式控制的按钮,我将制作一个“MySpecialButton”并在用户定义的运行时属性中设置属性。应该这样做。

【讨论】:

  • 之所以这样工作是因为外观属性是在视图添加到视图层次结构时应用的,而 nib 定义的属性是在视图添加到视图层次结构之前应用的。我自己不清楚的是,我认为 UIAppearance 会跟踪明确设置属性值的时间,并且如果有,则不会尝试应用该属性。需要更多研究。
猜你喜欢
  • 2013-01-09
  • 2012-07-23
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多