scroll上的button延遲響應問題

UIButton在某些情況下不能立刻響應TouchDown事件,換句話說,迅速點擊按鈕時,你是永遠看不見這個按鈕的高亮狀態的.
出現這種情況時,這些按鈕都在UIScrollView的子類上.這是因爲 scroll有一個屬性delaysContentTouches,默認值爲YES.值爲YES時,UIScrollView會在接收到手勢時延遲150ms來判斷該手勢是否能夠出發UIScrollView的滑動事件.

解決方案:

1、將UIButton所有屬於UIScrollView的父視圖的delaysContentTouches屬性設置成爲NO,此時UIScrollView會立馬將接收到的手勢分發到子視圖上。

  • 其中UITableView需要設置多層.

UITableView(包括UITableViewCell在內)在iOS7和iOS8中的視圖結構是不同的,且存在着很多我們在編碼時永遠接觸不到的視圖,但我們可通過Debug將其subviews逐個逐個找出來。

iOS7:UITableView中存在n+1個UIScrollView,一個是UITableView本身,另外n個存在於UITableViewCell與cell的contentView之間,類名爲UITableViewCellScrollView,活的不久,僅存在於iOS7中,在iOS8中已被移除。

iOS8以後:UITableView中存在2個UIScrollView,一個是UITableView本身,另外一個存在於UITableView與UITableViewCell之間,類名爲UITableViewWrapperView。需要注意的是,UITableViewWrapperView在iOS7中並不是一個UIScrollView。

2、僅僅設置屬性是不夠的,因爲如果想要拖動scrollView而起點落在其他有手勢識別的視圖上時會拖不動

  • (BOOL)touchesShouldCancelInContentView:(UIView *)view
    這個方法決定手勢是否取消傳遞到view上,拖動ScrollView時觸發。返回NO時,拖動手勢將留在ScrollView上,返回YES則將手勢傳到view上。(若view是UIControl,則默認返回YES)

繼承UIScrollView或UITableView,並重寫此方法,讓其響應拖動方法。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if ([view isKindOfClass:[UIButton class]])
{
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章