自定义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开发人员库中描述的方法:
向下滚动到“自定义外观”部分。 有几种方法可以设置几个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)