我该如何定制UISegmentedControl
?
我有 2 张图像,其中 1 张应在段处于活动状态时显示,而另一张应在段处于非活动状态时显示。我可以覆盖样式或其他东西,以便我将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];
}
编辑:因为这得到了一些宣传,一个更干净的解决方案是使用 [UIImage new] 而不是创建透明图像,例如:
[self.segControl setDividerImage:[UIImage new] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segControl setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
您可以使用 iOS 开发者库中描述的方法:
向下滚动到“自定义外观”部分。有一些方法可以为几个按钮状态设置背景图像、按钮分隔图像等。
这些方法仅适用于 iOS5 及更高版本。
@property tintColor
– backgroundImageForState:barMetrics:
– setBackgroundImage:forState:barMetrics:
– contentPositionAdjustmentForSegmentType:barMetrics:
– setContentPositionAdjustment:forSegmentType:barMetrics:
– dividerImageForLeftSegmentState:rightSegmentState:barMetrics:
– setDividerImage:forLeftSegmentState:rightSegmentState:barMetrics:
– titleTextAttributesForState:
– setTitleTextAttributes:forState:
最简单的方法是创建自己的模仿UISegmentedControl
. UISegmentedControl
只需安排一系列按钮并为您管理它们的图像状态;它没有做任何特别的事情。
是的,您确实需要为分段栏的每个部分提供 2 张图像(打开和关闭)。(4 段... 8 张图片。)但它可以让您设置总共 16 个选项!(在你的 GUI 中只消耗 1 行。)
我得到了一切工作除了......你如何隐藏原始段条图形?
无法将 alpha 设置为 0。(它还会隐藏您的图像。)
无法将“tintClear”设置为“清除”。(不知道为什么它会变成黑白的。)
无法将其设置为“隐藏”......根本没有任何效果。
无法将“背景”设置为“清除”。(背景不是分段条图形。)
我写了一些东西,正如@rpetrich 所解释的那样,没有放入数组中,我认为这是最简单的解决方案。希望有人觉得这很有用
。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并自己更改图像。您不需要继承 UISegmentedControl -记住组合优于继承!
var transparentImage = UIGraphicsGetImageFromCurrentImageContext() as? UIImage
UIGraphicsEndImageContext()
segControl.setBackgroundImage(transparentImage, for: .normal, barMetrics: .default)
segControl.setDividerImage(transparentImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
斯威夫特 4
这就是我管理它的方式。使用图像制作分段控件并插入分段。请务必将一张图像设置为选中,因为这将是初始选择的索引。还要将backgroundColor和tintColor设置为清除,以便分段控件仅显示您的图像。
var newSegmentedControl: UISegmentedControl = {
let segmentedControl = UISegmentedControl()
segmentedControl.insertSegment(with: UIImage(named: "x_Selected.jpg"), at: 0, animated: true)
segmentedControl.insertSegment(with: UIImage(named: "y_Normal.jpg"), at: 1, animated: true)
segmentedControl.addTarget(self, action: #selector(segmentedControlChanged), for: .valueChanged)
segmentedControl.selectedSegmentIndex = 0
segmentedControl.backgroundColor = .clear
segmentedControl.tintColor = .clear
}()
当分段控件的值发生变化时调用的函数。
@objc func segmentedControlChanged(sender: UISegmentedControl) {
if sender.selectedSegmentIndex == 0 {
sender.setImage(UIImage(named: "x_Selected.jpg"), forSegmentAt: sender.selectedSegmentIndex)
sender.setImage(UIImage(named: "y_Normal.jpg"), forSegmentAt: 1)
} else if sender.selectedSegmentIndex == 1 {
sender.setImage(UIImage(named: "x_Normal.jpg"), forSegmentAt: 0)
sender.setImage(UIImage(named: "y_Selected.jpg"), forSegmentAt: sender.selectedSegmentIndex)
}
}
希望你觉得这个有用 :)