38

我该如何定制UISegmentedControl

我有 2 张图像,其中 1 张应在段处于活动状态时显示,而另一张应在段处于非活动状态时显示。我可以覆盖样式或其他东西,以便我将UISegmentedControl自己的图像用作活动/非活动背景吗?

4

10 回答 10

33

除了“开”和“关”位置有两种不同的状态外,我还必须添加这个额外的代码:

- (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];
于 2012-07-05T23:21:08.383 回答
15

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

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

向下滚动到“自定义外观”部分。有一些方法可以为几个按钮状态设置背景图像、按钮分隔图像等。

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

@property tintColor  
– backgroundImageForState:barMetrics:
– setBackgroundImage:forState:barMetrics:
– contentPositionAdjustmentForSegmentType:barMetrics:
– setContentPositionAdjustment:forSegmentType:barMetrics:
– dividerImageForLeftSegmentState:rightSegmentState:barMetrics:
– setDividerImage:forLeftSegmentState:rightSegmentState:barMetrics:
– titleTextAttributesForState:
– setTitleTextAttributes:forState:
于 2012-04-09T20:50:03.680 回答
9

最简单的方法是创建自己的模仿UISegmentedControl. UISegmentedControl只需安排一系列按钮并为您管理它们的图像状态;它没有做任何特别的事情。

于 2010-09-21T03:15:18.050 回答
6

是的,您确实需要为分段栏的每个部分提供 2 张图像(打开和关闭)。(4 段... 8 张图片。)但它可以让您设置总共 16 个选项!(在你的 GUI 中只消耗 1 行。)

我得到了一切工作除了......你如何隐藏原始段条图形?

无法将 alpha 设置为 0。(它还会隐藏您的图像。)

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

无法将其设置为“隐藏”......根本没有任何效果。

无法将“背景”设置为“清除”。(背景不是分段条图形。)

于 2010-09-21T02:54:51.570 回答
6

我写了一些东西,正如@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;
    }
}
于 2011-08-24T15:31:35.920 回答
2

它工作得很好

[segmentControl setImage:[UIImage imageNamed:@"Rolenew.png"] forSegmentAtIndex:0];
于 2012-08-01T09:54:22.083 回答
1

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

于 2015-02-19T09:35:14.610 回答
0

为此,您必须监听UIControlEventValueChanged并自己更改图像。您不需要继承 UISegmentedControl -记住组合优于继承

于 2009-08-15T15:43:48.773 回答
0

Jon 的答案的 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)
于 2017-10-25T06:35:21.503 回答
0

斯威夫特 4

这就是我管理它的方式。使用图像制作分段控件并插入分段。请务必将一张图像设置为选中,因为这将是初始选择的索引。还要将backgroundColortintColor设置为清除,以便分段控件仅显示您的图像。

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)
    } 

}

希望你觉得这个有用 :)

于 2019-03-12T00:00:15.257 回答