1

スケールおよび/または回転変換が適用されている可能性のあるUIViewがあります。私のコントローラーは新しいコントローラーを作成し、そのコントローラーにビューを渡します。新しいコントローラーは新しいビューを作成し、渡されたビューと同じ場所と回転に配置しようとします。元のビューのフレームを変換して、場所とサイズを設定します。

CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];

これはうまく機能し、拡大縮小されたサイズと場所が完全にコピーされます。ただし、に回転変換が適用されているfromView場合、それは転送されませ

だから私はこの行を追加しました:

isv.transform = fromView.transform;

これは、回転だけでなく、スケール変換もうまく処理します。その結果、スケール変換が効果的に2回適用されるため、結果のビューが大きすぎます。

では、スケールを2倍にすることなく、位置(原点)、スケール、および回転を1つのビューから別のビューに転送するにはどうすればよいですか?


編集

これは、元のUIImageView(fromView)を使用してUIScrollView(ImageScrollViewサブクラス)のサイズと位置を設定する、より完全なコード例です。

CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
frame.origin.y += pagingScrollView.frame.origin.y;
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];
isv.layer.anchorPoint = fromView.layer.anchorPoint;
isv.transform = fromView.transform;
isv.bounds = fromView.bounds;
isv.center = [self.view convertPoint:fromView.center fromView:fromView.superview];
[self.view insertSubview:isv belowSubview:captionView];

そして、これがImageScrollViewの構成全体です。

- (id)initWithFrame:(CGRect)frame image:(UIImage *)image {
    if (self = [self initWithFrame:frame]) {
        CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height);
        imageLoaded = YES;
        imageView = [[UIImageView alloc] initWithImage:image];
        imageView.frame = rect;
        imageView.contentMode   = UIViewContentModeScaleAspectFill;
        imageView.clipsToBounds = YES;
        [self addSubview:imageView];
    }
    return self;
}

この醜いビデオimageViewでわかるように、変換によってが大きくなりすぎるように見えます。

4

2 に答える 2

7

bounds最初のビューの、、、centerおよびを2番目のビューにコピーしtransformます。

、、、およびから派生しframe値であるため、コードは機能しません。のセッターは、プロセスを逆にして正しいことを行おうとしますが、非IDが設定されている場合、常に正しく機能するとは限りません。boundscentertransformframetransform

ドキュメントはこの点でかなり明確です:

変換プロパティがID変換でない場合、このプロパティの値は未定義であるため、無視する必要があります。

..。

変換プロパティに非ID変換が含まれている場合、フレームプロパティの値は未定義であり、変更しないでください。その場合、centerプロパティを使用してビューの位置を変更し、代わりにboundsプロパティを使用してサイズを調整できます。

于 2012-04-18T07:17:00.923 に答える
3

viewAがフレームと変換を含む最初のビューであり、それらの値をviewBに渡したいとします。

そのため、変換を渡す前に、viewAの元のフレームを取得してviewBに渡す必要があります。それ以外の場合、変換を追加すると、viewBのフレームがもう一度変更されます。

元のフレームを取得するには、viewA.transformをCGAffineTransformIdentityに変更するだけです。

これがコードです

CGAffineTransform originalTransform = viewA.transform; // Remember old transform
viewA.transform = CGAffineTransformIdentity; // Remove transform so that you can get original frame
viewB.frame = viewA.frame; // Pass originalFrame into viewB
viewA.transform = originalTransform; // Restore transform into viewA
viewB.transform = originalTransform; // At this step, transform will change frame and make it the same with viewA

その後、viewAとviewBはsuperViewで同じUIを使用します。

于 2015-03-30T03:48:25.870 に答える