我正在尝试扩展 UISegmentedControl 的功能,但在处理各个分割时遇到了一些问题。这个问题似乎比较普遍,所以我从在线示例中借用了一些代码:http://www.framewreck.net/2010/07/custom-tintcolor-for-each-segment-of.html
为了便于引用:
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];
我最终得到:
如果我以编程方式创建 UISegmentedControl,我可以通过在将所选段添加到 subview 之前设置所选段来影响索引的偏移。将选定的段设置为 0 后,事情就会正确排列。然而,即使通过 GUI 选择不同的选定段,通过界面构建器,事情总是会被破坏。我假设是因为在选择段之前控件被添加到 subview 。
知道是什么导致了这种奇怪的行为吗?
最佳答案
[[[self subviews] objectAtIndex:segment] setTag:tag];
这行有问题。以相反的顺序设置段。例如。
#define kTagSecond 222
#define kTagFirst 111
[self.segment setTag:kTagFirst forSegmentAtIndex:1];
[self.segment setTag:kTagSecond forSegmentAtIndex:0];
其中kTagFirst是第一段,kTagSecond是第二段
关于ios - UISegmentedControl 段顺序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841849/