2

簡単なアニメーションが 1 つあります。

- (void)showMenu
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelay:0.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

    self.scrollView.frame = CGRectMake(296, -150, 432, 356);

    [self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_up.png"] forState:UIControlStateNormal];
    [self.view bringSubviewToFront:self.scrollView];

    [UIView commitAnimations];
}

このアニメーションを初めて呼び出すと、ボタンの画像が変わるだけで、スクロールビューの位置は変わりません。

showMenuメソッドを 2 回呼び出した後、すべてが正しく機能します。

  • 私は電話しますshowMenu。ボタンのイメージが変わります。scrollviewない位置
  • すべてをリセットする別のメソッドを呼び出します。ボタンのイメージが変わります。scrollviewない位置
  • 私は電話しますshowMenu。ボタンのイメージが変わります。scrollview変化の位置
  • これからは、呼び出すたびに機能しますshowmenu

2番目の方法はcloseMenu次のとおりです。

- (void)closeMenu
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelay:0.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

    self.scrollView.frame = CGRectMake(296, -317, 432, 356);

    [self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_down.png"] forState:UIControlStateNormal];

    [UIView commitAnimations];
}

では、2 回クリックしただけで機能するのはなぜですか?

4

2 に答える 2

3

プログラムで a を実行しUIAnimation、同時に a を追加すると、同じ問題が発生しました。UITableView枠はUIView変わりますが、表示は更新されません。

この問題を解決するperformSelector:withObject:afterDelay:には、遅延を 0 にしてメソッドを呼び出します。

于 2015-06-02T06:46:52.830 に答える
0

自動レイアウトをオンにしている場合frameは、ビューの変更に注意する必要があります。残念ながら、制約が再適用されると (テキスト ラベルの設定など、無数の一見無害なアクションによってトリガーされます)、手動で設定frameした値は制約によって管理される値に置き換えられます。

おそらく、このルーチンを 2 回目に呼び出したときに、この問題が顕在化することはないでしょう。おそらく、その直後に、制約が再適用される原因となるようなことを何もしていないからです。自動レイアウトがオンの場合でも、frame手動で を変更することができますが、それは機能しますが、制約が再適用されるとすぐに がframeリセットされる場合があります。

次の 2 つの解決策があります。

  1. 自動レイアウトを使用している場合は、制約定数の変更をアニメーション化できます。for 制約を作成し、アニメーション ブロック内でプロパティを変更する方法の例については、この回答の後半を参照してください。IBOutletconstant

  2. 自動レイアウトを無効にすることもできます。

于 2013-06-26T06:37:44.917 に答える