自定义UISegmentedControl

36 iphone cocoa-touch objective-c uisegmentedcontrol uikit

我该如何定制UISegmentedControl

我有2个图像,1表示段处于活动状态时应显示,而另一个图像处于非活动状态时应显示.我可以覆盖样式或其他东西,所以我有UISegmentedControl自己的图像作为活动/非活动背景吗?

Jon*_*Jon 33

我不得不添加这个额外的代码,除了为"开"和"关"位置有2个不同的状态:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

编辑:因为这是一个宣传,一个更清洁的解决方案是使用[UIImage新]而不是创建透明图像,因此:

 [self.segControl setDividerImage:[UIImage new] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 [self.segControl setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)


Boc*_*ica 14

您可以使用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:
Run Code Online (Sandbox Code Playgroud)


rpe*_*ich 9

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


Pat*_*cia 6

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

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

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

无法将"tintClear"设置为"clear".(不知道为什么它会变成黑色和白色.)

无法将其设置为"隐藏"......根本不会有任何作用.

无法将"背景"设置为"清除".(背景不是分段栏图形.)


Fre*_*pl3 6

我写了一些有用的东西,因为@rpetrich正在解释而不放在一个数组中,在我看来这是最容易解决的问题.希望有人觉得这很有用

.H

IBOutlet UIButton *index0;
IBOutlet UIButton *index1;
IBOutlet UIButton *index2;
IBOutlet UIImageView *segMentControl;

-(IBAction)segmentSwitch:(UIButton *) buttonIndexPressed;
Run Code Online (Sandbox Code Playgroud)

.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;
    }
}
Run Code Online (Sandbox Code Playgroud)


gro*_*hog 0

为此,您必须侦听 UIControlEventValueChanged自行更改图像。您不需要对 UISegmentedControl 进行子类化 -请记住组合优于继承!