6

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

我想要做的是用给定的角度旋转我的 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];

非常感谢!

4

2 回答 2

17

好的,我保证我会调查它,所以这是我的答案:

我创建了一个和你的场景有点等价的场景,代码如下:

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 的图像当然比不旋转的图像更宽。由于中心点已设置为视图的实际中心,因此框架的原点也会发生变化(被推到左侧和顶部)。请注意,图像本身的大小不会改变。我没有使用缩放变换,因为不需要缩放就可以实现结果。

但为了更清楚,这里有一些图片给你(0°,30° 90°旋转): UIImageView 的 0°、30° 和 90° 旋转

他们看起来已经很相似了,对吧?我绘制了实际的框架以明确边界和框架之间的区别。下一个真的很清楚。我覆盖了所有图像,将它们旋转 UIImageView 旋转的负度数,得到以下结果: UIImageViews 覆盖以显示大小不会改变

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

简而言之:不可能有一个 UIImageView 在旋转后具有相同的帧。这对于任何 UIView 都是不可能的。想想一个矩形。如果你旋转它,它不会是旋转后的矩形,是吗?

当然,您可以将 UIImageView 放在另一个 UIView 中,该 UIView 将具有宽度为 200、高度为 250 的非旋转框架,但这只是肤浅的,因为它不会真正改变旋转矩形具有与原版不同的宽度和高度。

我希望这有帮助。:)

于 2012-05-13T16:38:07.437 回答
0

请勿设置 UIImageView 继承自 UIView 并根据您选择的 UIViewContentMode 进行缩放、变换、设备旋转导致 frame 变化的 contentMode。

另外,如果您只想旋转,则可以使用以下方法更改框架:-

[UIView beginAnimations:@"Rotate" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    CGRect frame=yourView.frame;
    frame.origin.y+=distance you want to rotate;
    yourview.frame=frame;
    [UIView commitAnimations];
}

如果您不想要动画,只需更改框架

尝试使用这个:-

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 0.5f;            
animation.repeatCount = HUGE_VALF;     // HUGE_VALF is defined in math.h so import it
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"];
于 2012-05-13T08:18:08.900 回答