2013-03-06 30 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];