LINMOS.LOG

Amos Lin 的技術筆記

改善 UISlider 在 UIScrollView 裡的觸控成功率

在使用 ScrollView 來設計畫面時,如果加入諸如 Slider bar 之類的元件成為 subview,兩者的觸控事件就會有所影響,預設的情況下,如果使用者直接對 slider 作拖曳的動作,大多會觸發 scrollView 的滾動事件造成 slider 無法正常使用,除非先在 slider 按住停留一下才可以正常拖曳,這其實是跟 UIScrollView 的設計有關係。

在預設的情況下,scrollView 接收到觸控事件之後,會先 delay 以確定使用者有沒有繼續做滾動視圖的動作,如果有就會立即移動 scrollView,沒有的話才把觸控事件傳遞給上層的 UIControl 元件,這也就是造成前述問題的原因所在,接下來提供一個解決方法。

首先要繼承 UIScrollView 並且覆寫 touchesShouldCancelInContentView 方法,如下:

sample.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <UIKit/UIKit.h>

@interface MyScrollView : UIScrollView {
}
@end

@implementation MyScrollView

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    if ([view isKindOfClass:[UISlider class]]) {
        return NO;
    }
    return YES;
}

@end

重點是在第11行判斷 touch view 是否為 UISlider,並且回傳 NO。 接著設定 scrollView.delaysContentTouches = NO,停止觸控事件的延遲處理。

經過這樣處理如果還是不太容易操作 slider,這時可以把 slider 加入到一個區域面積比較大 UIView 裡,再放進 scrollView,然後前面的 touchesShouldCancelInContentView 也把這個 UIView 加入判斷,這樣就可以正常操作 slider 了,此方法也可以套用到其他元件上。

Comments