gpt4 book ai didi

objective-c - 为什么旋转后 UIImageView 的大小会发生变化?

转载 作者:可可西里 更新时间:2023-11-01 03:37:55 24 4
gpt4 key购买 nike

我是使用转换的新手。并且仍然对它们的工作方式感到困惑。

我想做的是将我的 UIImageView 旋转给定角度。但是旋转之后,它改变了图像的大小,变小了。我还对 ImageView 进行了缩放,这样它就不会颠倒了。如何在分配 ImageView 时旋转并保持 CGRectMake 中给出的大小?

    UIImageView *myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,width,height)];        

myImageView.contentMode = UIViewContentModeScaleAspectFit;

[myImageView setImage:[UIImage imageNamed:@"image.png"]];

myImageView.layer.anchorPoint = CGPointMake(0.5,0.5);

CGAffineTransform newTransform;

myImageView.transform = CGAffineTransformMakeScale(1,-1);

newTransform = CGAffineTransformRotate(newTransform, 30*M_PI/180);

[self.window addSubview:myImageView];

非常感谢!

最佳答案

好吧,我答应过会调查的,所以这是我的答案:

我创建了一个场景,应该和你的差不多,代码如下:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-100,
self.view.bounds.size.height/2-125,
200,
250)];

imageView.image = [UIImage imageNamed:@"testimage.jpg"];
imageView.contentMode = UIViewContentModeScaleAspectFill;

/*
* I added clipsToBounds, because my test image didn't have a size of 200x250px
*/
imageView.clipsToBounds = YES;

[self.view addSubview:imageView];

NSLog(@"frame: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds: %@",[NSValue valueWithCGRect:imageView.bounds]);

imageView.layer.anchorPoint = CGPointMake(0.5, 0.5);
imageView.transform = CGAffineTransformMakeRotation(30*M_PI/180);

NSLog(@"frame after rotation: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds after rotation: %@",[NSValue valueWithCGRect:imageView.bounds]);

此代码假定您使用的是 ARC。如果不加

[imageView release];   

最后。

使用此代码,日志如下所示:

[16221:207] frame: NSRect: {{60, 105}, {200, 250}}
[16221:207] bounds: NSRect: {{0, 0}, {200, 250}}
[16221:207] frame after rotation: NSRect: {{10.897461, 71.746826}, {298.20508, 316.50635}}
[16221:207] bounds after rotation: NSRect: {{0, 0}, {200, 250}}

如您所见,边界始终保持不变。由于旋转而实际改变的是框架,因为旋转 30°C 的图像当然比不旋转时更宽。由于中心点已设置为 View 的实际中心,框架的原点也会发生变化(被推到左侧和顶部)。请注意,图像本身的大小不会改变。我没有使用缩放转换,因为无需缩放即可获得结果。

但是为了更清楚这里有一些图片给你(0°,30° 90°旋转): 0°,30° and 90° rotations of UIImageView

它们看起来已经很相似了,对吧?我画了实际的框架,以明确边界和框架之间的区别。下一个真的很清楚。我覆盖了所有图像,将它们旋转 UIImageView 旋转的负度数,得到以下结果: UIImageViews overlayed to show that size doesn't change

所以您会发现旋转图像非常简单。现在您的问题是您实际上希望框架保持不变。如果您希望最终帧具有原始帧的大小(在此示例中,宽度为 200,高度为 250),则必须缩放生成的帧。但这当然会导致图像缩放,这是您不希望的。实际上,我认为更大的框架对您来说不是问题 - 您只需要知道,由于旋转,您必须考虑到它。

简而言之:不可能有一个 UIImageView 在旋转后具有相同的框架。这对任何 UIView 都是不可能的。想想一个矩形。旋转一下,旋转后就不是长方形了吧?

当然你可以把你的 UIImageView 放在另一个 UIView 里面,它有一个非旋转的框架,宽度为 200,高度为 250,但这只是表面的,因为它不会真正改变旋转的事实矩形的宽度和高度与原始矩形不同。

希望对您有所帮助。 :)

关于objective-c - 为什么旋转后 UIImageView 的大小会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10570151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com