2011-12-15 16 views
1

私はUIViewのカスタムサブクラスとその上に背景イメージを持つフルスクリーンUIButtonを持っています。右側に というUIViewとUIImageViewがありますそれ以外の重要なラベルやボタンはありません。重要なのは、UIViewに2つのスクロールビューがあり、実行時に垂直スクロールが有効になっているスクロールビューにUIButtons(小さいものではなく、200 x 100)を追加することです。 状況は本当に非常に複雑なので、さまざまな条件で何が起こるかはアイテムとして書きます。私のアプリケーションでは、UIViewのカスタムサブクラスにこれらの完全なスクリーンが10あり、UIPanGestureRecognizerを使用して1つから他のものにスクロールしています。これにはスクロールビューを使用しないのがよい理由があります。すべてのウィンドウ(UIWindowではなく、下の画像)はループ内で内容を取り込むため、実行中のコードはすべて同じですが、すべて同じ.xibファイルから作成されます。そして最後の情報は、すべてのウィンドウをカバーする大きなUIButtonがtouchupinsideのアクションを持ち、スクロールビューの小さなボタンが独自のtouchupinsideセレクターを持っています。uiscrollviewとuibuttonはタッチイベントに対して透過的に動作します

  • 私のウィンドウの中には、画面上のどこかをタッチすると、より大きなボタンアクションが呼び出されます。タッチしてドラッグするとスクロールが動作し、次の/前のウィンドウに移動しますスクロールビューの小さいボタンでは、そのアクションが発生し、最後にそれらのボタン内を完全にスクロールできます。
  • 私のウィンドウの中には、スクロールビューをスクロールしようとすると、大きなウィンドウのpangesturerecognizerが小さなスクロールビューではなく、このイベントをキャッチします。スクロールビューの小さなボタンに触れると、大きなボタンイベントが発生しますuibutton> uiscrollview> uiimageview>ボタンのuibuttonにuiviewが存在しないようにボタン
  • 右のコンテナのビューを大きなuibuttonの別の位置に置き換えると、ランダムにうまく動作するかどうか、時にはscrollviewsが動作します他の人はそうではありません。
  • これは一貫性のある動作をします。ある位置にあれば動作し、動作しますが、動作しない場合は動作しません。
  • また、すべてのビューとサブクラスではユーザーインタラクションが有効になっています。ビヘイビアは大きなuibuttonのコンテナビューの位置に応じて変更されるだけでなく、大きなuibuttonsバックグラウンドイメージに応じて変更されるため、
  • 私はtouchesBeganメソッドをテスト目的のために配置しました。タッチが期待どおりに機能しない場合、touch.viewで発生したイベントはスクロールビュー内の小さなボタンをタッチしても大きなボタンのコンテナです。

私はすでに2日間過ごしていますが、結果はありません。この現象は何が起こる可能性がありますか?

EDIT:krumelurのコメント後、これらのビューの設定からアニメーションにフォーカスを変更しました。私はコンテナビューに与えました。私は気づいています、問題はアニメーションについてです、私はコードを追加しています10個のウィンドウをすべてアニメーション化し、カスタムスクロールビューのように動作する部分。すべてのウィンドウにカスタムレイヤークラスがあり、Pangesture Recognizerをキャッチすると、次のコードで画面上のウィンドウを移動します。そのコード内の項目は、すべてのウィンドウのレイヤーを保持する配列です。アニメーションは、その奇妙な状況が発生するが、私は、私はタッチイベントに行く、でも私はCATransform3DMakeTranslationlayer.zPosition設定でビューを送り返す、ということを考え出しまし把握couldntのはまだ最後に...

- (void)layoutSublayers { 
[super layoutSublayers]; 

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 

float angleDelta = 2 * M_PI/[items count]; 
float a = angle; 

for (UIBaseLayer *l in items) { 

    l.position = self.position; 

    CATransform3D translation = CATransform3DMakeTranslation(cosf(a)*(radius.x), 1.0, (sinf(a)*radius.y) - radius.y*1.0); 

    float dailyAngle = (M_PI_2 - a); 
    CATransform3D rotation = CATransform3DMakeRotation(dailyAngle, 0, 1.0, 0); 
    CATransform3D t = CATransform3DConcat(rotation, translation); 
    l.transform = t; 

    a += angleDelta; 
} 
[CATransaction commit];} 

http://img836.imageshack.us/img836/296/screenshot20111215at013.png

+0

私はあなたを苛立たせたくありませんが、あなたの質問は複雑であり、徹底的な答えのための情報があまりにも少ないと言います。間違っていることが多いので、問題が何であるかを伝えることは不可能です。 UIScrollViewのいくつかのプロパティが正しく設定されていない、誤って配線されたイベントハンドラ、ビューのzオーダーが混在する可能性があります。 私はデバッグの基本を提案します:それを簡素化します。それを壊す。不要なコントロールを削除します。あなたのデザインを考え直してください。やり直してください。 – Krumelur

答えて

0

フレームの位置に応じてビューを表示します。現在も見られていないビュー(他人がオーバーレイしている)は、まだまだ触れています。現在画面上に表示されているビューに対して1行のコード([self.superview bringSubviewToFront:self])を書くだけで問題は解決しました。

これをテストし、私が何を言っているのか理解するために、私は2つのボタンしかない簡単なテストアプリケーションを作った。
青色と黄色のボタン。青色のボタンは黄色のボタンの上に重なるため、最初は青色のボタンが表示されます。
青いボタンの内部コードを入力すると、buttons.layer.zPosition = -1と返信します。この後、青いボタンの目に見える部分は画面に残りません。代わりに黄色のボタンだけが表示されますが、黄色いボタンをタッチすると(または私が触っていると思います)、青色のボタンがコード内をタッチします。

これが望ましいロジックかどうかは分かりませんが、私にとっては妥当ではないようです。

上記のとおり、レイヤーzPositionを-1に設定している間に、[blueButton.superview sendSubviewToBack:blueButton]を書き込むと、期待どおりに動作します。

1

bringSubviewToFrontは5.0で確実に動作しませんでした(5.1にハックが必要とされていなかった)

私はそれが前に5.1へのiOS上でこの問題を解決するために無効になっていたかのように振る舞ったボタンの周りに大きなtransparrent UIButtonを追加する必要がありました。

関連する問題