Pwn*_*ner 6 iphone cocoa-touch uisegmentedcontrol uiview ios
我已经将UIView子类化了.将此子类的对象添加到其superview后,它需要自动运行一些代码.如何挂钩此事件以运行我的代码?
UISegmentedControl的所选分段的背景众所周知难以设计.我能找到的最好的解决方案是做这个黑客:
#import "SegmentedControlStyled.h"
@implementation SegmentedControlStyled
- (void) updateStyle
{
for (NSUInteger i = 0; i < [self.subviews count]; i++) {
if ([[self.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[self.subviews objectAtIndex:i] isSelected]) {
[[self.subviews objectAtIndex:i] setTintColor:[UIColor colorWithWhite:0.7 alpha:1.0]];
}
if ([[self.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[self.subviews objectAtIndex:i] isSelected]) {
[[self.subviews objectAtIndex:i] setTintColor:[UIColor colorWithWhite:0.9 alpha:1.0]];
}
}
}
@end
Run Code Online (Sandbox Code Playgroud)
updateStyle需要在两个地方调用此函数.显然,第一个是用户点击不同的段时.我可以通过覆盖我SegmentedControlStyled的addTarget功能和挂钩UIControlEventValueChanged事件来自主地做到这一点.updateStyle需要调用的第二个位置是在将 a SegmentedControlStyled添加到其superview之后.你可能会问,"你为什么要这样称呼它而不是某个地方init?".好吧,从我的观察来看,在它被附加到视图之前调用它是没有效果的.因此,需要像这样编写代码:
SegmentedControlStyled* seg = [[SegmentedControlStyled alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]];
[self.view addSubview:seg];
[seg updateStyle];
Run Code Online (Sandbox Code Playgroud)
最后一行是丑陋的,因为使用我的子类的同事必须理解为什么视图被破坏并且必须知道何时调用updateStyle.为了坚持面向对象的封装原则,这个细节应该移到类本身.如果我能够检测何时将视图添加到其superview中,我将能够将样式hack封装在我的子类中.
ver*_*rec 10
覆盖任何一个
- (void)didAddSubview:(UIView *)subview
- (void)willMoveToSuperview:(UIView *)newSuperview
- (void)willMoveToWindow:(UIWindow *)newWindow
Run Code Online (Sandbox Code Playgroud)
作为适当的?