2013-07-17 56 views
13

我有UIScrollView加載了UIButtonsUIButton我已經突出顯示UIImage的每個UIButtonUIScrollview delaysContentTouches問題

如果我不設置delaysContentTouchesNO如果我碰了UIButton非常快的UIButtonUIImage不會出那麼突出。在我設置delaysContentTouches屬性爲NO之後,只有UIButton突出顯示UIImage顯示。

現在設置delaysContentTouches屬性爲UIScrollView的NO。拖動UIButtons我無法滾動我的UIScrollView。現在我該如何解決這個問題。

請給我一個建議。

在此先感謝。

+3

的delaysContentTouches意味着滾動視圖總是會首先得到觸摸,並決定是否進行滾動,或者不考慮如果滑動上。第一個測試是您看到的延遲,當您將此屬性設置爲NO時,您說您不希望滾動視圖首先觸摸,但所有子視圖都應該接受觸摸.... –

+0

如果按鈕是真的很小,然後不滾動那個按鈕可以工作。如果你有一個非常大的按鈕,但仍然希望按鈕先觸摸按鈕,但當你滑動手指時仍然滾動,那麼我唯一能想到的做法就是添加一個手勢識別器,用於滑動錯誤刷卡。手勢識別器會覆蓋觸摸事件,當您調用手勢的方法時,只需重新設置滾動視圖的內容即可。我沒有試過這個,所以我不知道它是否會工作.... –

+0

我可以做一些事情,當我長時間觸摸我的按鈕,然後我的觸摸傳遞給下面的滾動視圖。可能嗎?或者我怎麼能做到這一點? –

回答

5

OK我已經通過實施以下方法解決:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    NSLog(@"touchesShouldCancelInContentView"); 

    if ([view isKindOfClass:[UIButton class]]) 
     return NO; 
    else 
     return YES; 
} 
+0

不幸的是我不工作(我沒有設置scrollviews委託) – Chris

+0

好吧,它工作,如果你的子類uiscrollview(這不是一個委託方法),並反轉上面的NO/YES值。 – Chris

+0

首先,如果視圖是UIButton,則返回YES。 「NO」已經是默認行爲。其次,它應該在else子句中返回'[super touchesShouldCancelInContentView:view]'。 – devios1

2

無法在網上找到一個滿意的解決方案爲止(這似乎是蘋果忽略的問題)。在Apple的開發人員論壇上發現一個線索,並提供一些建議,可能有所幫助:UIScrollView: 'delaysContentTouches' ignored

我能夠使用此鏈接的解決方法。總結解決方法(我在這裏是對齊引用):

UIEvent對象包含一個時間戳記。

您可以在touchesBegan時刻記錄您的 嵌入式子視圖的時間戳。

在touches移動scrollView的子視圖時,再次查看時間戳和 位置。

如果觸摸沒有移動很遠,比如說0.1秒 已經過去了,則可以假定用戶觸摸了子視圖,然後再延遲移動 。

在這種情況下,UIScrollView將獨立決定 這不是一個滾動操作,即使它永遠不會告訴你 那個。

所以,你可以有一個狀態變到標誌 延遲運動的這種情況發生,並通過子視圖接收處理事件。

這裏是我的代碼:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // store the timestamp 
    _beginDragTimeStamp = event.timestamp;  

    // your embedded subview's touches begin code 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // compare and ignore drag if time passed between tap and drag is less than 0.5s 
    if(event.timestamp - _beginDragTimeStamp < 0.5) return; 

    // your drag code 
} 
26

下面是我的作品。 UIScrollView的子類,並實現只有這個方法:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

然後設置delaysContentTouches = NO;

瞧!工作就像在主屏幕上:亮點立刻按鈕,但仍允許滾動:)

+1

這適用於我,謝謝! – benck

+0

謝謝Chris,這是唯一可行的解​​決方案。 – Andy

+0

這爲我工作。下面的其他解決方案沒有(與tableView.delaysContentTouches =是結合) –

8

我發現,在iOS版8,UIScrollView的基本UIPanGestureRecognizer不尊重UIScrollView的delaysContentTouches財產。我認爲這是一個iOS 8的錯誤。這裏是我的解決辦法:在同一的UITableViewCell

設置delaysContentTouches爲NO的UIButton:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches 
+0

我相信你的意思theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches; 它幫助了我,謝謝你!我希望它打破別的東西。 – Lope

+0

謝謝。你是對的。我的意思是PanGestureRecognizer的delaysTouchesBegan屬性應該反映UIScrollView的delaysContentTouches屬性。供參考; – lifjoy

+0

供參考;我向蘋果公司提交了一份雷達缺陷報告,並將其標記爲重複。 – lifjoy

0

我有同樣的問題&相同的看法層次,隨着最新的SDK,只是使用它。

self.scrollview.delaysContentTouches = NO