2011-02-05 1 views
1

ビューのサブビューの一部をビューの境界にクリップしたいだけです。これを迅速かつ簡単に実装する方法を設定するためのアイデア。UIViewに「選択的」clipToBoundsを実装する方法、つまり他のサブビューをクリップしないでください。

コンテキストの場合:ビューからドラッグできるサブビューのセットを持つUIScrollViewがあります。ビューからそれらをドラッグすると、サブビューがクリップされないようにします。そうでなければ、私はそれらを切り取ってほしい。

  • サブビューをレイアウトする前に[view setClipToBounds:YES]を実行すると、サブビューをドラッグするまではすべて正常です。ドラッグが開始されたときに、touchesBegan:withEventで[view setClipToBounds:NO]を実行し、touchesEnded:withEvent:で[view setClipToBounds:YES]を実行すると、ドラッグ中にスクロールビューが再描画されるため、以前にクリップされたサブビューが表示されます。
  • 私が試したが、うまくいかないアプローチは、ドラッグが開始されるとすぐに、スクロールビューからスクロールビューのスーパービュー(サブビューのtouchesBegan:withEvent)にサブビューを移動しています。ただし、ビューをあるビューから別のビューに移動すると、タッチの追跡が失われ、ドラッグが終了したように見えます。
+0

なぜそれをUIScrollViewDelegateメソッドで実装しないのですか? – Felix

+0

「更新」を答えに入れてそれを受け入れるべきです。 –

+0

ありがとうJesse。私はあなたのアドバイスを取ってきました。 – Obliquely

答えて

2

私は次のように問題を解決しました。 scrollviewのサブビューがtouchesBegan:withEventを受け取ると、そのサブビューのアルファ値を0.0に設定しました。私はその後、同じサブビューを作成し、スクロールビューのスーパービューに追加します。私は以下を使用した初期位置の場合:

CGPoint newOrigin = [self origin]; 
newOrigin.x = newOrigin.x + [[self superview] origin].x; 
newOrigin.y = newOrigin.y + [[self superview] origin].y - [(UIScrollView*)[self superview] contentOffset].y; 
[newSubview setOrigin: newOrigin]; // setOrigin is defined in a category on UIView - it does what you'd expect 

(注 - ...あなたはscrollviewのコンテンツに対して補償しない場合は、動作が不可解得ることができますオフセット)

マイtouchesMoved:withEventメソッドが動きます(通常はドラッグを実装するために)サブビューし、次にtouchesEnded:withEventはスクロールビューのスーパービューから余分なサブビューを削除し、最初のサブビューのアルファを1.0に戻します。したがって、実際には、追加のサブビューは、目に見えないサブビューにピギーバックします。