我有一个 UIView,它可能应用了缩放和/或旋转变换。我的控制器创建一个新控制器并将视图传递给它。新控制器创建一个新视图并尝试将其放置在与传递的视图相同的位置和旋转中。它通过转换原始视图的框架来设置位置和大小:
CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];
这很好用,完美复制了缩放的大小和位置。但是,如果对 应用了旋转变换fromView
,则它不会传输。
所以我添加了这一行:
isv.transform = fromView.transform;
这很好地处理了旋转以及缩放变换。结果是缩放变换有效地应用了两次,因此结果视图太大了。
那么如何在不加倍比例的情况下将位置(原点)、比例和旋转从一个视图转移到另一个视图?
编辑
这是一个更完整的代码示例,其中原始 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
放大了太大。