自定义UISegmentedControl

我如何做一个自定义的UISegmentedControl

我有2张图片,当段被激活时应该显示1,而如果段没有激活,则显示另一张。 我可以重写样式或东西,所以我有一个UISegmentedControl与我自己的图像作为活动/不活动的背景?

我不得不添加这个额外的代码,除了“开”和“关”两个不同的状态:

 - (void)viewDidLoad { [super viewDidLoad]; // Set set segControl background to transparent CGRect rect = CGRectMake(0, 0, 1, 1); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]); CGContextFillRect(context, rect); UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [self.segControl setBackgroundImage:transparentImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [self.segControl setDividerImage:transparentImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; } 

编辑:因为这是得到一些宣传,更清洁的解决scheme是使用[UIImage新],而不是创build透明的图像,因此:

  [self.segControl setDividerImage:[UIImage new] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [self.segControl setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

您可以使用iOS开发人员库中描述的方法:

http://developer.apple.com/library/ios/ipad/#documentation/uikit/reference/UISegmentedControl_Class/Reference/UISegmentedControl.html

向下滚动到“自定义外观”部分。 有几种方法可以设置几个button状态的背景图像,button分割图像等。

这些方法仅适用于iOS5及更高版本。

 @property tintColor – backgroundImageForState:barMetrics: – setBackgroundImage:forState:barMetrics: – contentPositionAdjustmentForSegmentType:barMetrics: – setContentPositionAdjustment:forSegmentType:barMetrics: – dividerImageForLeftSegmentState:rightSegmentState:barMetrics: – setDividerImage:forLeftSegmentState:rightSegmentState:barMetrics: – titleTextAttributesForState: – setTitleTextAttributes:forState: 

最简单的方法是创build模拟UISegmentedControl自己的控件。 UISegmentedControl只是安排一系列的button,并为您pipe理他们的图像状态; 它没有做任何特别的事情。

是的,你需要为分段条的每个部分需要2个图像(打开和closures)。 (4段… 8个图像)但它可以让你设置总共16个select! (在GUI中只消耗1行)。

我得到了一切工作除了…你怎么隐藏原始段的条形图?

无法将Alpha设置为0.(它也会隐藏您的图像。)

无法将“tintClear”设置为“清除”。 (不知道为什么它会变成黑色和白色。)

不能将其设置为“隐藏”…没有任何工作。

无法将“背景”设置为“清除”。 (背景不是分段栏graphics。)

我写了一些工作,作为@rpetrich解释没有放置在一个数组,在我看来是最简单的解决scheme。 希望有人认为这有用

。H

 IBOutlet UIButton *index0; IBOutlet UIButton *index1; IBOutlet UIButton *index2; IBOutlet UIImageView *segMentControl; -(IBAction)segmentSwitch:(UIButton *) buttonIndexPressed; 

.M

 -(IBAction)segmentSwitch:(UIButton *) buttonIndexPressed { if (buttonIpressed == index0) { [segmentControl setImage:[UIImage imageNamed:@"Seg1Sel.png"]]; NSLog(@"index 0 pushed"); index0.enabled = NO; index1.enabled = YES; index2.enabled = YES; } else if (buttonIpressed == index1) { [segmentControl setImage:[UIImage imageNamed:@"Seg2Sel.png"]]; NSLog(@"index 1 pushed"); index0.enabled = YES; index1.enabled = NO; index2.enabled = YES; } else if (buttonIpressed == index2) { [segmentControl setImage:[UIImage imageNamed:@"Seg3Sel.png"]]; NSLog(@"index 2 pushed"); index0.enabled = YES; index1.enabled = YES; index2.enabled = NO; } } 

它工作得很好

 [segmentControl setImage:[UIImage imageNamed:@"Rolenew.png"] forSegmentAtIndex:0]; 

尝试HMSegmentedControl,它也允许图像和其他设置。 可在https://github.com/HeshamMegid/HMSegmentedControl

为了做到这一点,你必须听取UIControlEventValueChanged并自己改变图像。 你不应该需要inheritance UISegmentedControl – 记住inheritance的组合是首选!

乔恩答案的Swift 3.0版本。

 var transparentImage = UIGraphicsGetImageFromCurrentImageContext() as? UIImage UIGraphicsEndImageContext() segControl.setBackgroundImage(transparentImage, for: .normal, barMetrics: .default) segControl.setDividerImage(transparentImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)