2

layoutSubviews では、子ビューを適切な位置にレイアウトし、それらの一部に何らかの変換を適用します。ここで、このサブビューで再現可能なスケール アニメーションを作成して注目を集めたいと思います。しかし、[UIView animate....] でアニメーションを起動すると、transform プロパティを変更して、layoutSubviews メソッドを起動し、アニメーションと競合します (transform をオーバーライドし、アニメーションは再生されません)。

この動作を処理する良い方法 (bool フラグなし) はありますか?

例:

- (void)layoutSubviews {
    [super layoutSubviews];
    myChildView.transform = CGAffineTransformMake....;
}

- (void)animate {
    CGAffineTransform originalTransform = myChildView.transform;
    [UIView animateWithDuration:0.1f
                          delay:0.0f
                        options:UIViewAnimationOptionAutoreverse
                     animations:^{
                         [UIView setAnimationRepeatCount:4];
                         //next line of code produce calling layoutSubviews
                         myChildView.transform = CGAffineTransformMakeScale(1.15f, 1.15f);
                     } completion:^(BOOL finished){
                         myChildView.transform = originalTransform; 
                         //after this also called layoutSubviews
                     }];
}
4

4 に答える 4

2

最近、この問題に遭遇しました。ビュー コントローラー内のメソッドをオーバーライドしてviewDidLayoutSubviews、アニメーションを制御します。

- (void)viewDidLayoutSubviews {
     // This method will be called after subview's layoutSubviews.
     if (self.shouldAnimated) {
        // Do animation at here.
     }
}

ただし、これは単なる汚い解決策です。

于 2013-10-27T15:13:08.473 に答える
1

layoutSubviewsを使用しない方がよいことをお勧めします。代わりに、initメソッド内、またはinitから呼び出されるカスタムメソッドのいずれかでサブビューを作成、配置、および変換します。

于 2013-02-27T12:32:23.353 に答える
1

私もこの問題に遭遇します。そして、別のビュー (subView と呼ばれる) をサブビューとして追加し、myChildView を subView に追加します。これは、myChildView の変換を変更しても、スーパービューの layoutSubviews をトリガーしません。なぜ、このUIView/CALayer: Transform triggers layoutSubviews in superview を見ることができます。

于 2016-12-26T07:14:57.307 に答える
-1

この動作を処理する良い方法 (bool フラグなし) はありますか?

はい。「layoutSubviews」メソッドを取り除き、別のメソッドで子ビューの変換を設定します。

[self.parentView setUpChildrenViews];
...
[self.parentView animate];
于 2013-02-27T11:38:47.103 に答える