Ios UISegmentedControl除法器错误

Ios UISegmentedControl除法器错误,ios,objective-c,uisegmentedcontrol,Ios,Objective C,Uisegmentedcontrol,我的UISegmentedControl分区遇到了一个奇怪的错误。当我将手指拖开时,片段将丢失其高亮显示的状态图像,但分割器将保留该图像。我需要拖大约100px的距离才能发生这种情况 向下,对准目标: 向下,手指被拖离目标: 假设0表示正常状态,1表示选定状态,2表示突出显示状态;我有所有正确的分割图像,并为每种情况设置它们,即: 00, 01, 02 10, 11, 12 20, 21, 22 其他一切都很好,如果我点击并保持目标,就没有问题了。我不希望用户会点击和拖动,但我宁愿解决这个

我的UISegmentedControl分区遇到了一个奇怪的错误。当我将手指拖开时,片段将丢失其高亮显示的状态图像,但分割器将保留该图像。我需要拖大约100px的距离才能发生这种情况

向下,对准目标:

向下,手指被拖离目标:

假设0表示正常状态,1表示选定状态,2表示突出显示状态;我有所有正确的分割图像,并为每种情况设置它们,即:

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

其他一切都很好,如果我点击并保持目标,就没有问题了。我不希望用户会点击和拖动,但我宁愿解决这个问题。以前有人经历过这种情况吗?

一种可能的解决方案是手动将UISegmentedControl子类化,并重写它,以确保在调用UIResponder事件时正确地“清除”了分隔器状态。这可能是因为该段预期touchesMoved事件将在与初始ToucheSStart相同的边界内发生。

无需为“11”和“22”状态提供分割图像,因为从逻辑上讲,您不能有两个相邻的选定段或两个相邻的高亮显示段。好吧,只有同时点击相邻的片段才能同时突出显示它们,但不太可能

因此,您应该具有以下分割图像:

00, 01, 02  
10, --, 12  
20, 21, --
此外,对于所有3种不同的状态(正常、选定和高亮显示),您还应该有3个背景图像。我已经解释了产生这些背景图像的原因以及如何创建它们(在该解释中,我仅使用了两个背景图像用于正常和选定状态,但如果要使用高亮显示状态,则需要添加第三个背景图像)

下图显示了如何在UISegmentedControl中使用这些图像:

然后使用以下外观方法进行设置:

// 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]
别忘了这道菜 uicontrol选中状态| uicontrol突出显示状态

// 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];

可能重复:对不起,这不是重复的。那个人在程序选择后与分隔符有问题。我的分割器在创建和编程选择时工作,唯一的问题是当按住线段,然后将手指拖离点击目标很远时,分割器会混淆其状态。