2010-12-08 4 views
0

これは初心者の質問ですので、事前にお詫び申し上げます。インターフェイスビルダでオフスクリーンでレイアウトしたUIViewがあります。ユーザーがボタンを押すと、画面上にこのビューをアニメートしたいと思います。それは動作しますが、私はUIViewのボタンと対話できません。実際にオブジェクトが位置を保持しているので、UIViewsのレイヤーの位置を設定しようとしましたが、UIViewメニューで余分な81ピクセルを左側に表示しています。これが起こると、私はボタンとやりとりすることができますが、私はそれを画面の右側と一致させる必要があります。ここに私のコードはopenMenuボタンをIBActionである:iPad - 画面上にアニメーション表示されているユーザーの操作はありません

animationDidStop方法で
CABasicAnimation *moveView = [CABasicAnimation animationWithKeyPath:@"position"]; 
moveView.delegate = self; 
moveView.duration=0.5; 

// If the menu is displayed, close it! 
CGPoint currentPosView = [[entirePage layer] position]; 
CGPoint destView; 

[moveView setFromValue:[NSValue valueWithCGPoint:currentPosView]]; 

if (menuDisplayed) { 
    // Move right to our destination 
    destView.x = currentPosView.x; 
    destView.y = currentPosView.y + 81; 

    [moveView setToValue:[NSValue valueWithCGPoint:destView]]; 

// Otherwise, open it 
} else { 
    // Move left to our destination 
    destView.x = currentPosView.x; 
    destView.y = currentPosView.y - 81; 

    [moveView setToValue:[NSValue valueWithCGPoint:destView]]; 
} 

// Animate the view 
[[entirePage layer] addAnimation:moveView forKey:@"move"]; 

// Set the final position of our layer 
[[entirePage layer] setPosition:destView]; 

menuDisplayed = !menuDisplayed; 

そして:

CGPoint currentPosMenu = [[menuBar layer] position]; 

if (menuDisplayed) { 
    currentPosMenu.x -= 81; 
} else { 
    currentPosMenu.x += 81; 
} 

[[menuBar layer] setPosition:currentPosMenu]; 

ヘルプ???

+0

私は最近同様の問題がありました。親ビューの境界の外側に描画されたビューは、相互作用できません。また、Core Animationはアニメーションのみを行うことも間違いありません。実際のプロパティは変更されません。 userInteractionEnabledを試してみてください。これでうまくいかない場合は、アニメーションが終了したら汚れてスーパービューからビューを削除し、直後にもう一度追加することができます。 –

+0

このプロジェクトの締め切り日は近づいていますが、回避策が見つかりました(しかし、私が望むものではありません)。 UIViewを最初に表示してから、すべてを表示外にスライドさせます。タッチインタラクションは、メニューが戻ったときに機能しますが、別の方法が必要です。 – Jacob

答えて

0

レイヤーを混乱させる必要はありません。 Interface Builderでビューをアニメーション表示した後の位置に配置することで、必要な効果を得ることができます。言い換えれば、最初に物事を最終的/正しい位置に置く。 IBで何かすごいことはしないでください。

UIViewControllerを使用している場合は、アプリケーションが起動された後、または-viewDidAppear:メソッドでコードを編集すると、ビューをある量だけオフセットしてアニメーションブロックの元の位置に復元できます。

myView.transform = CGAffineTransformMakeTranslation(0,81); 

[UIView beginAnimations:@"slideUp" context:nil]; 
myView.transform = CGAffineTransformIdentity; 
[UIView commitAnimations]; 

あなたの意見にユーザーのやりとりがないことは、さまざまなことが考えられます。すべてのビューがUIImageViewのようなもののサブビューである場合、UIImageViewはデフォルトでNOに設定されています(少なくとも、コードでビルドすると、IBのデフォルト設定がイメージビュー用であるとは限りません)。また、ビューのスーパービューが実際には小さすぎ、フレームにサブビューが含まれていない可能性があります。 (クリッピングは、スーパーのためにオンになっていた場合、あなたも、この特定の問題を抱えているサブビューを確認することができません。)

EDIT:

私はもっと慎重に物事を読んで、あなたは物事を移動する見ボタンの押下に応答して、言い換えるとビューは最初から隠されている必要があります。その場合でも、IBのすべてを最終的な位置に置いておくことができますが、IBに隠しておくだけです。ボタンを押すと、翻訳を開始する前にビューが表示されます(非表示= NO)。それは彼らがあなたが望むアニメーション効果を得ながら適切なスーパービューなどに配置されていることを確認してIBの彼らの最終的/正しい場所に配置することができるはずです。

+0

申し訳ありませんが、私はこれをフォローアップしませんでしたが、上記のmyView.transform = CGAffineTransformMakeTranslation(81,0)のソリューションとその変換を元に戻す設定は素晴らしいものです。ありがとうございました! – Jacob

0

今のところアニメーションについては忘れてください。 frameプロパティを設定してビューを移動する必要があります。あなたはあなたのビューが正しい場所に配置されていることを確認が完了するまで

例えば:

CGRect menuFrame = entirePage.frame; 
if (menuDisplayed) 
{ 
    menuFrame.origin.x += 81; 
} 
else 
{ 
    menuFrame.origin.x -= 81; 
} 
entirePage.frame = menuFrame; 

// Do your animation here, after the view has been moved 

は、アニメーションを心配しないでください。そのコードが正しく動作していることを確認したら、の後にアニメーションを行い、frameプロパティを設定します。

何か複雑なことをしない限り、おそらくCoreAnimation APIを使用する必要はないことに注意してください。 UIKitは単独でアニメーションを行うことができます。 E.g:

関連する問題