スケールおよび/または回転変換が適用されている可能性のある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
でわかるように、変換によってが大きくなりすぎるように見えます。