2010-09-17 46 views
10

查看iPhone或iPad上的App Store應用程序,特別是顯示屏幕截圖的應用程序詳細信息屏幕上的應用程序。屏幕截圖查看器會顯示您正在查看的屏幕截圖以及下一個和上一個屏幕的邊緣。我需要實現類似的東西。通過查看鄰居頁面來查看UIScrollView

我如何做到這一點對窮人來說是公平的:我構建了一個UIScrollView並啓用了分頁並且佈置了我的內容。我使框架與內容頁面大小相同,但比屏幕小。然後我禁用了clipToBounds,所以ScrollView的框架之外的東西仍然被繪製。現在我可以看到相鄰頁面的邊緣,但它們不在ScrollView中,因此無法接收滾動觸摸。 App Store應用程序可讓您觸摸該事物的整個寬度,包括相鄰頁面的窺視邊緣。

那他們怎麼做到的?

回答

17

您需要在滾動視圖的'後面'添加一個視圖,該視圖覆蓋了您的頁面可見的整個區域。這個視圖應該實現-hitTest:withEvent :.該方法將被操作系統調用以確定在哪裏路由特定的觸摸事件。所有你需要做的就是回到你的滾動視圖這個後盾視圖中的任何點:

- (UIView *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event { 
    if (CGRectContainsPoint(self.bounds, pt)) return self.scrollView; 
    return [super hitTest: pt withEvent: event]; 
} 
+0

我簡直不敢相信!在我可以嘗試一兩天之前(我的客戶部分計劃不好,事實上,這實際上構成了我的一部分緊急事件,事實證明),但我會臨時給你檢查。乾杯! – 2010-09-17 14:16:29

+0

非常感謝這個答案,本!這確實很好。 – 2010-12-13 15:28:10

+3

我也嘗試了上面的解決方案,但發現滾動視圖中的項目本身不再接收觸摸事件 - 只有滾動視圖。這是預期的行爲? – 2010-12-14 10:39:30

0

不要忘了,如果你想你的內容範圍之外留互動的觸摸轉發給了滾動子視圖。

如果您已將滾動視圖內容放入額外的容器中,則以下示例爲true。如果情況並非如此,則循環播放子視圖並返回被觸摸命中的那個。

- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event 
{ 
    UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil; 
    return [contentView hitTest:pt withEvent:event]; 
} 
+1

我試過這個,但UIScrollView的hittest方法永遠不會被調用。你如何做你的視圖層次? – htafoya 2012-12-04 03:54:18