2009-10-07 62 views
3

我有一個UIScrollView的要求,在縮放時,contentSize.height應該保持不變。例如,從200x100放大應該會導致新的contentSize爲400x100,而不是400x200。我想在用戶縮放時自己做繪畫。實現自定義縮放UIScrollView

我不認爲我可以使用UIScrollView的正常縮放行爲來實現這一點,所以我試圖推出自己的。 (我可以讓它做它的事情,然後重繪我的內容時,-scrollViewDidEndZooming:withView:atScale:被調用,但那不會很漂亮)。

目前我繼承的UIScrollView,並試圖在兩個手指在屏幕上做我自己變焦:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touches count] != 2) { 
     [super touchesMoved:touches withEvent:event]; 
    } else { 
    // do my own stuff 
    } 
} 

我認爲,通過重寫的touchesBegan:withEvent:,touchesMoved:withEvent:,touchesEnded:withEvent:方法並觸及取消:withEvent:這種方式應該可以工作,但事實並非如此。

一個較早的嘗試失敗是放在滾動視圖的頂部透明視窗和發送,我不感興趣,到了滾動觸摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touches count] != 2) { 
     [self.theScrollView touchesMoved:touches withEvent:event]; 
    } else { 
    // do my own stuff 
    } 
} 

任何幫助,將不勝感激。

感謝, 托馬斯

回答

3

你可能將無法在變焦過程中保持不俗的表現,如果你嘗試重繪你的內容在捏縮放事件的每一幀。我建議採取讓UIScrollView放大或縮小繪圖縮放版本的方法,然後在縮放結束時重新將內容重新繪製成-scrollViewDidEndZooming:withView:atScale:delegate方法。這是我在我的應用程序中所做的,並且最終運行得非常好。

有一些技巧,在變焦,這是我在this answer介紹有關正確調整您的內容視圖。基本上,您需要攔截轉換到您的內容視圖的設置,以便在重繪內容時可以將其設置爲1的比例因子。您還需要跟蹤該換算係數的,因爲UIScrollView的不和使用比例係數調整變換的UIScrollView嘗試應用與後續的縮放操作的內容視圖。

你可以使用一個修改這種技術來迫使夾變焦的過程中你的內容的重繪,但在我的測試中該結束了過於生澀,以提供良好的用戶體驗。

+0

好的,謝謝,我會嘗試攔截的setTransform:在夾變焦結束重繪視圖。我可能會嘗試徹底重新繪製視圖,看看性能如何。今天無法做到這一點,但我會讓你知道我是怎麼走的。 – 2009-10-07 20:05:32

+0

我做了一個快速測試,截獲了setTransform :,並且每次嘗試重繪我的內容視圖。你是對的,出於性能原因,這不是設備上的選項。我會按照你推薦的方式讓UIScrollView縮放,然後在-scrollViewDidEndZooming:withView:atScale:處重繪。謝謝。 – 2009-10-08 22:23:48

0

我不知道你是什麼意思本:

我認爲,通過重寫 的touchesBegan:withEvent:, touchesMoved:withEvent:, touchesEnded:withEvent :和 touchesCledlled:withEvent:在這個 的方式應該工作,但它不。

你沒有得到事件嗎?你應該會收到這些事件,但是我認爲你的if語句中有一個邏輯錯誤,可能會阻止它發揮作用。

if ([touches count] != 2) 

這是一個問題,因爲兩次觸摸恰好同時發生的可能性很低。當觸摸獨立發生時,以及用戶握住手指靜止並移動另一個時,您會希望能夠處理。在這些場景中(這是常見的),您只能在該NSSet中進行一次接觸,即使其他接口仍然有效。

妥善處理觸摸的解決方案是記住一些關於哪些觸摸進來和哪些觸摸離開。請記住,UITouch的地址在觸摸壽命中不會改變,因此您可以安全地比較地址,以確保您仍然處理與之前相同的觸摸,並跟蹤其生命週期。

如果你沒有得到的觸摸事件,那麼這是一個不同的問題完全,您可能需要打開設置multiTouchEnabled:YES

+0

我在從iPhone 3章此基礎編程觸摸NSSet用於訪問觸摸的位置。我並不知道每次觸碰移動時,NSSet都可能不包含所有的觸摸事件:withEvent:被調用。 – 2009-10-07 20:02:16

+0

我使用了multiTouchEnabled,但在我看來,UIScrollView在幕後做了一些奇特的事情。一旦用戶開始滾動或縮放,是否有可能在其自身頂部添加新的視圖來處理所有的觸摸事件?那是我的想法,但我沒有花太多時間仔細研究這個理論。 – 2009-10-08 22:30:42

0

我試圖做同樣的事情,因爲這和我真的希望能夠,而它的變焦重繪。在scrollViewDidEndZooming中最後修復它:withView:atScale不夠好。

我做到這一點是通過在viewForZoomingInScrollView虛擬視圖的方式:和閱讀虛擬視線的高度,並設置到任何我想要的實際內容視圖的框架。因爲框架發生了變化,這意味着drawRect每次都會被調用。在模擬器上看起來很好,我只畫了幾行。但我實際上並不擁有一個設備,所以我無法正確測試它。

另外,在你有密碼,必須的touchesBegan:withEvent:方法,但那麼你就轉發到超級touchesMoved:withEvent:方法代替的touchesBegan:withEvent:方法

+0

我每次都嘗試重繪我的內容視圖,雖然它在模擬器中正常工作,但在我的iPhone 3G上甚至不可接受。我用我測試的數據只繪製了9個CGPath。但是,我的UIScrollView目前是透明的,這可能對性能有相當大的影響。無論如何,您應該嘗試在實際設備上測試您的代碼 - 如果您在變焦過程中重繪速度太慢,我也不會感到驚訝。 – 2009-10-08 22:28:05