3

回転変換が適用された UIView に対して以下のコードを実行すると、奇妙な問題が発生しました。私がやろうとしているのは、スーパービューからビューを削除し、特定のビューの下に挿入してそのフレームを復元することです:

  UIView* movedView=  [self.views objectAtIndex:newIndex];
    center = movedView.center;

   CGRect oldFrame  = movedView.frame;

    //find the layer on top and insert the moved view under that
    UIView* coveringView = [self.views objectAtIndex:newIndex-1];
    [movedView removeFromSuperview];
    [self.view insertSubview:movedView belowSubview:coveringView];
    movedView.frame = oldFrame;

操作後、ビューは同じ場所に表示されると思いますが、CGAffineTransformMakeRotation() によって適用された回転の量に基づいて移動します。

フレームを割り当てる呼び出しをcenterプロパティを割り当てる呼び出しに置き換えることで、望ましい動作が得られました。これは私に考えさせられました.UIViewのフレームが回転したときに何が起こっているのかを理解するにはどうすればよいでしょうか? 変換がUIViewのフレームにどのように影響するかを概念的に理解するのに役立つ良いチュートリアルまたは何かがありますか?

4

3 に答える 3

4

-[UIView frame]ドキュメントには次のように書かれています。

警告:transformプロパティが恒等変換でない場合、このプロパティの値は定義されていないため、無視する必要があります。

この:

このプロパティへの変更はアニメーション化できます。ただし、transformプロパティに非恒等変換が含まれている場合、プロパティの値frameは未定義であり、変更しないでください。その場合、プロパティを使用してビューの位置を変更し、代わりにプロパティcenterを使用してサイズを調整できます。bounds

あなたはアイデンティティではないframeので、プロパティについて考えることをまったく避けたいと思うかもしれません。transform

于 2013-04-19T19:38:40.247 に答える
4

a の後、 aCGAffineTransformのプロパティframeUIViewもはや定義されていません。ドキュメントには、「警告: 変換プロパティが恒等変換でない場合、このプロパティの値は定義されていないため、無視する必要があります」と記載されています。

于 2013-04-19T19:40:17.780 に答える
0

私の意見では、 は、 、およびframeによって計算されます。centertransformbounds

式のように: frame = f(center,transform,bounds). でも中身はわからないf(x)

于 2013-04-20T10:49:15.130 に答える