0

さて、これは初心者の質問ですので、事前にお詫び申し上げます。InterfaceBuilderの画面外にレイアウトしたUIViewがあります。ユーザーがボタンを押すと、このビューを画面上でアニメーション化したいと思います。動作しますが、UIViewのボタンを操作できません。アニメーション化するとビューのみが移動し、実際のオブジェクトはその位置を保持することを読みました。そのため、UIViewのレイヤーの位置を設定しようとしましたが、UIViewメニューの左側に81ピクセル余分に表示されます。これが発生した場合、ボタンを操作できますが、画面の右側と同じ高さにする必要があります。openMenuボタンのIBActionのコードは次のとおりです。

 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;

そして、animationDidStopメソッドで:

 CGPoint currentPosMenu = [[menuBar layer] position];

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

 [[menuBar layer] setPosition:currentPosMenu]; 

ヘルプ???

4

2 に答える 2

0

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

コードでは、アプリの起動後、またはUIViewControllerを使用している場合は-viewDidAppear:メソッドで、ビューをある程度オフセットしてから、アニメーションブロック内の元の位置に復元できます。

myView.transform = CGAffineTransformMakeTranslation(0,81);

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

ビューでのユーザーインタラクションの欠如に関しては、それは多くのことである可能性があります。すべてのビューがUIImageViewのようなサブビューである場合、UIImageViewではデフォルトでuserInteractionEnabledがNOに設定されています(少なくともコードでビルドする場合は、画像ビューのIBのデフォルト設定がわかりません)。また、ビューのスーパービューが実際には小さすぎて、そのフレームにサブビューが含まれていないことを意味している可能性もあります。(スーパービューに対してクリッピングがオンになっている場合、この特定の問題が発生しているサブビューを表示することもできません。)

編集:

私は物事をもっと注意深く読み、ボタンを押すと物事を動かしたいので、言い換えれば、ビューを最初から隠す必要があります。その場合でも、すべてをIBの最終的な位置に配置できますが、IBに非表示に設定するだけです。ボタンを押すときは、ビューを変換する前に、ビューを表示(hidden = NO)に設定してください。これにより、必要なアニメーション効果を維持しながら、適切なスーパービューなどに配置されていることを確認しながら、IBの最終/正しい場所に配置できるようになります。

于 2010-12-09T04:35:29.220 に答える
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にアニメーションを実行します。

複雑なことをしているのでない限り、CoreAnimationAPIを使用する必要はおそらくないことに注意してください。UIKitはそれ自体でアニメーションを行うことができます。例えば:

[UIView beginAnimations:@"MyAnimation" context:NULL];
myFirstView.frame = ...;
myOtherView.frame = ...;
[UIView commitAnimations];
于 2010-12-09T04:56:13.147 に答える