zou*_*oul 10 cocoa-touch ios uiappearance
我在我的视图类(后代UIView)中有一些自定义外观属性.我想根据这些属性自定义视图外观,但我不能在初始化程序中执行此操作,因为设置的值[[MyClass appearance] setFoo:…]在此时无效:
@interface View : UIView
@property(strong) UIColor *someColor UI_APPEARANCE_SELECTOR;
@end
@implementation View
@synthesize someColor;
// Somewhere in other code before the initializer is called:
// [[View appearance] setSomeColor:[UIColor blackColor]];
- (id) initWithFrame: (CGRect) frame
{
self = [super initWithFrame:frame];
NSLog(@"%@", someColor); // nil
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
它们已经设置好layoutSubviews,但这不是执行视图自定义的好点,因为某些自定义可能会layoutSubviews再次触发,从而导致无限循环.
那么,执行自定义有什么好处呢?或者有没有办法触发应用外观值的代码?
一种可能的解决方法是直接从代理获取值:
\n\n- (id) initWithFrame: (CGRect) frame\n{\n self = [super initWithFrame:frame];\n NSLog(@"%@", [[View appearance] someColor); // not nil\n return self;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当然,这会取消根据视图容器改变外观的选项,并且通常很难看。我发现的第二个选项是在设置器中执行自定义:
\n\n- (void) setSomeColor: (UIColor*) newColor\n{\n someColor = newColor;\n // do whatever is needed\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我仍然\xe2\x80\x99d 宁愿有一些在设置外观属性后被调用的钩子。
\n| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |