ios - UISegmentedControl 段顺序困惑

标签 ios objective-c ios7 uisegmentedcontrol

我正在尝试扩展 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];

我最终得到:

demented SegmentedControl

如果我以编程方式创建 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/

相关文章:

iphone - 如何在 ios 中使用 AudioUnits 保存音频文件?

objective-c - NSURLSession 确保上传有效

ios - 比 days/7 更准确地计算自纪元以来的周数

ios - 如何使用持续时间为单个 UICollectionView 单元格设置动画

iphone - 自定义 UIView 在 [super dealloc] 上抛出 EXC_BAD_ACCESS

objective-c - 在 iOS 中注册自定义文件类型

objective-c - Facebook sdk 框架未找到 ios7,xcode5

ios - 如何使用 Fandango API?

iphone - MKMapView userTrackingMode 被 CLSqliteDatabaseManager 覆盖

仅使用 Xcode 6.0.1 在 iOS 7 上 iOS 应用程序崩溃 - 无法识别的选择器发送到实例