5

我正在使用带有一些自定义图像的 UISegmentedControl:

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"0.png"] atIndex:0 animated:NO];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"1.png"] atIndex:1 animated:NO];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"2.png"] atIndex:2 animated:NO];
segmentedControl.frame = CGRectMake(0, 0, 90, 30);
[self.view addSubview:segmentedControl];
[segmentedControl release];

这部分工作正常。但是,它仍然使用 Apple 的控件样式,只是在上面添加了我的图像。有没有一种方法,我不必使用 Apple 的样式,并使用我自己的没有背景的图像自定义控制?我还想拥有自己的“选定”状态图像。

可能的?

4

2 回答 2

3

尼克,

在玩了一段时间之后,我决定以某种方式简单地“自己动手”。

我在 Photoshop 中制作了一些按钮图像,让所有东西看起来都像一个分段控件。然后,我为所有按钮的“选定”状态设置了不同的图像。当按下一个按钮时,我向其他按钮调用 setSelected:NO。然后,我处理了我需要做的任何事情。

我很想听听其他解决方案。

于 2010-11-15T19:10:41.577 回答
0

除了 DexterW 的回答。我做出了同样的决定——只模仿UISegmentedControl使用UIButtons
然而,模仿它并不是一项简单的任务UISegmentControl。我尝试使用Selecteda 的状态,UIButton但如果为和状态UIButton设置相同的设置(背景图像、字体颜色),则不会按预期工作。在这种情况下,当片段看起来被选中时,它在视觉上仍然是“可按压的”。因此,为了避免它并使按钮设置的行为更像我根本没有使用状态。相反,Id 决定在代码中更改选定按钮的外观,以便选定按钮的状态在视觉上是相同的,而对于未选定的按钮则不同。HightlightedSelectedUISegmentedControlselectednormalhighlighted
假设我有3个按钮segmentedControl(LeftSgm | MiddleSgm | RightSgm),对于正常状态,我使用名为“segment_default”的背景图片和白色字体,对于选定状态,它的背景图片名为“segment_active”和黑色字体。所以在 onTouchDown 中:

-(IBAction)onTopMenuTap:(id)sender
{
    int newSelectedSegmentIndex;
    if (sender == btnLeftSgm)
        newSelectedSegmentIndex=0;
    else if (sender == btnMiddleSgm)
        newSelectedSegmentIndex=1;
    else if (sender == btnRightSgm)
        newSelectedSegmentIndex=2;
    else
        return;

    NSLog(@"Tapped segment index %d while old one is %d",newSelectedSegmentIndex,selectedSegmentIndex);

    if (newSelectedSegmentIndex==selectedSegmentIndex)
        return;

    [self handleSegmentAppearenace:newSelectedSegmentIndex];
//do whatever its need to be done
...
}

并且被调用的方法是

-(void)handleSegmentAppearenace:(int)newSelectedSegmentIndex
{
    if (selectedSegmentIndex==0){
        [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_left"] forState:UIControlStateNormal];
        [btnLeftSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnLeftSgm.highlighted = NO;
    }
    else if (selectedSegmentIndex==1){
        [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_center"] forState:UIControlStateNormal];
        [btnMiddleSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnMiddleSgm.highlighted = NO;
    }
    else if (selectedSegmentIndex==2){
        [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_right"] forState:UIControlStateNormal];
        [btnRightSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnRightSgm.highlighted = NO;
    }

    if (newSelectedSegmentIndex==0){
        [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_left"] forState:UIControlStateNormal];
        [btnLeftSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnLeftSgm.highlighted = YES;
    }
    else if (newSelectedSegmentIndex==1){
        [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_center"] forState:UIControlStateNormal];
        [btnMiddleSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnMiddleSgm.highlighted = YES;
    }
    else if (newSelectedSegmentIndex==2){
        [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_right"] forState:UIControlStateNormal];
        [btnRightSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnRightSgm.highlighted = YES;
    }
}

所有三个按钮都在 IB 中绑定到相应的属性(btnRightSgm 等)。也为“修饰事件” onTopMenuTap 绑定。
不能说这是一个最好的主意,但它对我来说非常有效。

于 2013-10-29T12:30:08.663 回答