the*_*ory 0 cocoa-touch uiview cgaffinetransform cgrect
我有一个UIView可能会应用比例和/或旋转变换.我的控制器创建一个新控制器并将视图传递给它.新控制器创建一个新视图,并尝试将其放置在与传递视图相同的位置和旋转中.它通过转换原始视图的框架来设置位置和大小:
CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];
Run Code Online (Sandbox Code Playgroud)
这很好用,缩放的大小和位置完美复制.但是,如果有变换应用到旋转fromView,它并没有转移.
所以我添加了这一行:
isv.transform = fromView.transform;
Run Code Online (Sandbox Code Playgroud)
很好地处理转移旋转,但也转换比例转换.结果是缩放变换有效地应用了两次,因此得到的视图太大了.
那么如何将位置(原点),比例和旋转从一个视图转移到另一个视图,而不会使比例增加一倍?
编辑
这是一个更完整的代码示例,其中原始的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];
Run Code Online (Sandbox Code Playgroud)
这是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;
}
Run Code Online (Sandbox Code Playgroud)
看起来好像变换导致imageView扩展太大,正如你在这个丑陋的视频中看到的那样.
复制第一种观点的bounds,center和transform第二种观点.
您的代码不工作,因为frame是一个价值来源于了bounds,center和transform.frame尝试通过反转过程来做正确的事情的setter ,但是当设置了非身份时它不能总是正常工作transform.
关于这一点,文档非常明确:
如果transform属性不是identity变换,则此属性的值是未定义的,因此应该被忽略.
...
如果transform属性包含非标识变换,则frame属性的值是未定义的,不应修改.在这种情况下,您可以使用center属性重新定位视图,并使用bounds属性调整大小.
| 归档时间: |
|
| 查看次数: |
1916 次 |
| 最近记录: |