2013-03-06 91 views
4

我遇到了一个奇怪的错误与我的UISegmentedControl分隔符。当我将手指拖走时,该段会丢失其突出显示的状态图像,但分隔线会保留它。为了发生这种情况,我需要拖动大约100px。UISegmentedControl分隔线bug

下,目标:

Down on target

向下,手指从目标拖走:

Down off target

鉴于0表示正常状态下,1个选择状态,和2突出状态;我有所有适当的分隔图像,我将它们设置为每一种情况下,那就是:

00, 01, 02 
10, 11, 12 
20, 21, 22 

其他一切工作正常,如果我点击和目标我认为不存在任何问题。我不希望用户会点击和拖动,但我宁愿让这个问题得到解决。有谁之前经历过这个吗?

+1

可能重复:http://stackoverflow.com/questions/9114186/customizing-uisegmentedcontrol-in-ios-5 – kineticfocus 2013-03-06 17:26:19

+0

很抱歉,但它不是一个副本。在编程选择之后,该人遇到分隔线问题。我的分隔线是在创作过程中进行的,而且通过程序化选择,唯一的问题是,当按住分段,然后将手指拖离分接点目标时,分隔线会混淆它们的状态。 – bpercevic 2013-03-06 19:31:41

回答

2

没有必要为“11”和“22”状态提供分隔图像,因为从逻辑上讲,不能有2个相邻选定分段或2个相邻高亮分段。那么,只有同时点击相邻区段才会突出显示它们,但不太可能。

因此,你应该有以下分频器图片:

00, 01, 02 
10, --, 12 
20, 21, -- 

此外,还应该对所有3种状态(正常,选择和高亮显示)3个的背景图像。这些背景图像的原因以及如何创建它们我已经解释了here(在那个解释中,我只用了2个背景图像用于Normal和Selected状态,但是如果你想使用Highlighted状态,那么你需要添加第三个背景图像)。

这里是一个展示这些图像是如何在UISegmentedControl使用的运行图: enter image description here

,然后用下面的外观的方法进行设置:

// Set background images 
[segmentedControl setBackgroundImage:background_image_normal 
          forState:UIControlStateNormal 
          barMetrics:UIBarMetricsDefault]; 
[segmentedControl setBackgroundImage:background_image_selected 
          forState:UIControlStateSelected 
          barMetrics:UIBarMetricsDefault]; 
[segmentedControl setBackgroundImage:background_image_highlighted 
          forState:UIControlStateHighlighted 
          barMetrics:UIBarMetricsDefault]; 

// Set divider images 0=Normal 1=Selected 2=Highlighted 
[segmentedControl setDividerImage:divider_image_00 
       forLeftSegmentState:UIControlStateNormal 
       rightSegmentState:UIControlStateNormal 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_01 
       forLeftSegmentState:UIControlStateNormal 
       rightSegmentState:UIControlStateSelected 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_10 
       forLeftSegmentState:UIControlStateSelected 
       rightSegmentState:UIControlStateNormal 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_02 
       forLeftSegmentState:UIControlStateNormal 
       rightSegmentState:UIControlStateHighlighted 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_20 
       forLeftSegmentState:UIControlStateHighlighted 
       rightSegmentState:UIControlStateNormal 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_12 
       forLeftSegmentState:UIControlStateSelected 
       rightSegmentState:UIControlStateHighlighted 
         barMetrics:UIBarMetricsDefault] 
[segmentedControl setDividerImage:divider_image_21 
       forLeftSegmentState:UIControlStateHighlighted 
       rightSegmentState:UIControlStateSelected 
         barMetrics:UIBarMetricsDefault] 
0

一个可能的解决方案是手动对UISegmentedControl进行分类,并覆盖它以确保在调用UIResponder事件时正确“清除”分隔符状态。这可能是该段正在预测touchesMoved事件发生在与初始touchesBegan相同的边界内。

0

不要忘记UIControlStateSelected的 | UIControlStateHighlighted

// Set background images 
UIImage *normalBackgroundImage = [UIImage imageNamed:@"segmented-background-unselected"]; 
UIImage *selectedBackgroundImage = [UIImage imageNamed:@"segmented-background-selected"]; 
[self setBackgroundImage:normalBackgroundImage 
       forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self setBackgroundImage:selectedBackgroundImage 
       forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
[self setBackgroundImage:normalBackgroundImage 
       forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
[self setBackgroundImage:selectedBackgroundImage 
       forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 

// Set divider images 
UIImage *buttonImageLeftSelected = [UIImage imageNamed:@"segmented-left-selected"]; 
UIImage *buttonImageNoneSelected = [UIImage imageNamed:@"segmented-none-selected"]; 
UIImage *buttonImageRightSelected = [UIImage imageNamed:@"segmented-right-selected"]; 

[self setDividerImage:buttonImageNoneSelected 
    forLeftSegmentState:UIControlStateNormal 
     rightSegmentState:UIControlStateNormal 
      barMetrics:UIBarMetricsDefault]; 

[self setDividerImage:buttonImageLeftSelected 
    forLeftSegmentState:UIControlStateSelected 
     rightSegmentState:UIControlStateNormal 
      barMetrics:UIBarMetricsDefault]; 
[self setDividerImage:buttonImageLeftSelected 
    forLeftSegmentState:UIControlStateSelected | UIControlStateHighlighted 
     rightSegmentState:UIControlStateNormal 
      barMetrics:UIBarMetricsDefault]; 
[self setDividerImage:buttonImageLeftSelected 
    forLeftSegmentState:UIControlStateSelected 
     rightSegmentState:UIControlStateHighlighted 
      barMetrics:UIBarMetricsDefault]; 

[self setDividerImage:buttonImageRightSelected 
    forLeftSegmentState:UIControlStateHighlighted 
     rightSegmentState:UIControlStateSelected 
      barMetrics:UIBarMetricsDefault]; 
[self setDividerImage:buttonImageRightSelected 
    forLeftSegmentState:UIControlStateNormal 
     rightSegmentState:UIControlStateSelected | UIControlStateHighlighted 
      barMetrics:UIBarMetricsDefault]; 
[self setDividerImage:buttonImageRightSelected 
    forLeftSegmentState:UIControlStateNormal 
     rightSegmentState:UIControlStateSelected 
      barMetrics:UIBarMetricsDefault];