2014-05-24 3 views
1

저는 UISegmentedControl의 기능을 확장하려고하고 있으며 개별 세그먼트 작업에 몇 가지 문제가 있습니다. 문제는 상대적으로 일반적인 것 같다, 그래서 예로부터 몇 가지 코드를 차용하고있어 온라인 : 쉽게 참조 할 수 http://www.framewreck.net/2010/07/custom-tintcolor-for-each-segment-of.htmlUISegmentedControl 세그먼트 순서 혼란

:

UISegmentedControlExtension.h

@interface UISegmentedControl(CustomTintExtension) 
-(void)setTag:(NSInteger)tag forSegmentAtIndex:(NSUInteger)segment; 
-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag; 
-(void)setTextColor:(UIColor*)color forTag:(NSInteger)aTag; 
-(void)setShadowColor:(UIColor*)color forTag:(NSInteger)aTag; 
@end 

UISegmentedControlExtension. m

#import "UISegmentedControlExtension.h" 

@implementation UISegmentedControl(CustomTintExtension) 

-(void)setTag:(NSInteger)tag forSegmentAtIndex:(NSUInteger)segment { 
[[[self subviews] objectAtIndex:segment] setTag:tag]; 
} 

-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag { 
// must operate by tags. Subview index is unreliable 
UIView *segment = [self viewWithTag:aTag]; 
SEL tint = @selector(setTintColor:); 

// UISegment is an undocumented class, so tread carefully 
// if the segment exists and if it responds to the setTintColor message 
if (segment && ([segment respondsToSelector:tint])) { 
[segment performSelector:tint withObject:color]; 
} 
} 

-(void)setTextColor:(UIColor*)color forTag:(NSInteger)aTag { 
UIView *segment = [self viewWithTag:aTag]; 
for (UIView *view in segment.subviews) { 
SEL text = @selector(setTextColor:); 

// if the sub view exists and if it responds to the setTextColor message 
if (view && ([view respondsToSelector:text])) { 
    [view performSelector:text withObject:color]; 
} 
} 
} 

-(void)setShadowColor:(UIColor*)color forTag:(NSInteger)aTag { 

// you probably know the drill by now 
// you could also combine setShadowColor and setTextColor 
UIView *segment = [self viewWithTag:aTag]; 
for (UIView *view in segment.subviews) { 
SEL shadowColor = @selector(setShadowColor:); 
if (view && ([view respondsToSelector:shadowColor])) { 
    [view performSelector:shadowColor withObject:color]; 
} 
} 
} 

@end 

[_segmentedControl titleForSegmentAtIndex:i] 

과 :이 경우라고 생각하지 않지만, 같은 것을에서 인덱스에가는 이상한 일이 확실히있다 - 위의 예 "나중에 어떤 시점에서, 세그먼트 인덱스 변경"주장 다음 예제의 코드를 사용하여 :

[_segmentedControl setTintColor:[UIColor blueColor] forTag:Blue]; 

내가 통과 및 세그먼트의 제목을 사용하여 각 세그먼트의 인덱스를 매핑하는 경우 :

typedef NS_ENUM(int, colorvalues) { 
    Blue, Brown, Green, Red, White, Yellow 
}; 
if ([@"Blue" isEqual: title]) { 
    NSLog(@"Setting Blue(%d) tag on segment: %d", Blue, i); 
    [_segmentedControl setTag:Blue forSegmentAtIndex:i]; 
} else if ([@"Brown" isEqual: title]) { 
    NSLog(@"Setting Brown tag on segment: %d", i); 
    [_segmentedControl setTag:Brown forSegmentAtIndex:i]; 
} else if ([@"Green" isEqual: title]) { 
    NSLog(@"Setting Green tag on segment: %d", i); 
    [_segmentedControl setTag:Green forSegmentAtIndex:i]; 
} else if ([@"Red" isEqual: title]) { 
    NSLog(@"Setting Red tag on segment: %d", i); 
    [_segmentedControl setTag:Red forSegmentAtIndex:i]; 
} else if ([@"White" isEqual: title]) { 
    NSLog(@"Setting White tag on segment: %d", i); 
    [_segmentedControl setTag:White forSegmentAtIndex:i]; 
} else if ([@"Yellow" isEqual: title]) { 
    NSLog(@"Setting Yellow tag on segment: %d", i); 
    [_segmentedControl setTag:Yellow forSegmentAtIndex:i]; 
} 

을하고 색조가를 사용하여 설정 예 코드 위 :

[_segmentedControl setTintColor:[UIColor blueColor] forTag:Blue]; 
[_segmentedControl setTintColor:[UIColor brownColor] forTag:Brown]; 
[_segmentedControl setTintColor:[UIColor greenColor] forTag:Green]; 
[_segmentedControl setTintColor:[UIColor redColor] forTag:Red]; 
[_segmentedControl setTintColor:[UIColor whiteColor] forTag:White]; 
[_segmentedControl setTintColor:[UIColor yellowColor] forTag:Yellow]; 

I가 끝낼 :

demented SegmentedControl

I는 UISegmentedControl을 만들면 프로그램 I는 하위 뷰에 추가하기 전에 선택된 세그먼트를 설정하여 인덱스의 오프셋에 영향을 미칠 수있다 . 선택한 세그먼트를 0으로 설정하면 일이 올바르게 정렬됩니다. 그러나 인터페이스 빌더를 통해 GUI를 통해 다른 선택된 세그먼트를 선택할 때조차 끊임없이 문제가 발생합니다. 세그먼트를 선택하기 전에 컨트롤이 하위보기에 추가되기 때문에 가정합니다.

어떤 이상한 행동을 일으키는 아이디어가 있습니까?

답변

0
[[[self subviews] objectAtIndex:segment] setTag:tag]; 

이 줄에는 문제가 있습니다. 세그먼트를 역순으로 설정하십시오. 예 : kTagFirst 첫 번째 세그먼트와 kTagSecond 번째 세그먼트

이다

#define kTagSecond 222 
#define kTagFirst 111 
[self.segment setTag:kTagFirst forSegmentAtIndex:1]; 
[self.segment setTag:kTagSecond forSegmentAtIndex:0];