CGAffineTransform和图像居中缩放

10

我开始使用Rory Lewis的iPhone和iPad绝对初学者应用程序一书学习Objective-C,但在第5章卡住了。

我想制作一个缩小图像的按钮。
我的问题是,在编写所有代码后,图像会缩小到UIImageView(左上角)的点(0,0),而在视频中,图像会缩小到其中心。我进行了一些研究,并发现CGAffineTransform使用对象的中心来进行平移、旋转等操作。

那么为什么在我的情况下不起作用呢?

我使用的是最新的Xcode版本,并没有做任何奇怪的事情。 希望我表达清楚了。抱歉我的英语不好。

编辑 抱歉代码有误,因为我是用手机写的问题。 无论如何,涉及到的部分大致如下:

- (IBAction)shrink:(id)sender {

if(hasShrink == NO){
    [shrinkButton setTitle:@"Grow" forState:UIControlStateNormal];
}
else if(hasShrink == YES){
    [shrinkButton setTitle:@"Shrink" forState:UIControlStateNormal];
}
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.0];
        myIcon.transform = CGAffineTransformMakeScale(.25, .25);
        hasShrink = YES;
        [UIView commitAnimations];

}

所有的动画都已经正确编写,应用程序确实可以工作,只是它缩小到左上角。为什么点不像应该那样默认设置在UIImageView的中心呢?
编辑: 我发现这是由AutoLayout引起的问题。 一旦禁用,一切都很顺利 ;)

2
你能发一下你正在使用的代码吗? - Zev Eisenberg
3个回答

9
如果您正在转换由自动布局管理的视图,则可能会遇到一些奇怪的副作用。我最终采用的解决方案是将我想要转换的视图封装在一个完全相同大小的另一个视图中。外部视图应用了适当的布局约束,而内部视图只是居中于其容器中。现在对内部视图应用CGAffineTransform比例变换,就可以正确地居中。请参见此答案以获取更多详细信息。

谢谢,那帮了我很多! - aparesidam

8

旧问题...但以防其他人来寻找:

CGAffineTransform作用于一个锚点(旋转、缩放)。

如果你的大小为0,0,那么你的锚点设置为0,0。如果你想要它缩放到一个不同的点,比如图片的中心,你需要改变锚点。

锚点是图层的一部分

所以如果你有一个名为imageviewUIImageView,你需要通过如下调用来将锚点设置为imageview的中心:

[imageview.layer setAnchorPoint:CGPointMake(0.5, 0.5)];

4
anchorPoint 是以相对值进行测量的,默认值为 0.5, 0.5,即视图的中心点。使用像素值将无法得到期望的结果。 - devios1

7

尝试像这样:

CGAffineTransform t = CGAffineTransformMakeScale(0.5, 0.5);
CGPoint center = imageView.center; // or any point you want
[UIView animateWithDuration:0.5
                 animations:^{
                    imageView.transform = t;
                    imageView.center = center;
                 }
                 completion:^(BOOL finished) {
                    /* do something next */
                 }];

下次请展示您的代码,这样更容易帮助您。

请查看此项目:https://github.com/djromero/StackOverflow/archive/Q-13706255.zip

您必须学习自动布局和自动调整大小如何影响您的视图。在上述项目中,两者都被禁用,以让您看到它是如何工作的。


我已按照您的要求操作,但是如果我打印myImage.center.xmyImage.center.y的值,它仍然指向左上角。我尝试了三次重新启动项目,仍然存在相同的问题,即使只编写缩小按钮的代码。`- (IBAction)shrink:(id)sender {if(hasMoved == NO && hasShrink == NO){ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0]; _myIcon.transform = sizeShrink; hasShrink = YES; [UIView commitAnimations];` - halfblood17
如果你正在使用那段代码,那么你并没有按照我的要求去做。请更新问题并附上你的源代码,不要添加评论(难以阅读,也不是正确的位置)。 - djromero
好的,我会修复这个问题。但是我仍然尝试只使用你的代码,但没有任何改变...它在移动时仍然会调整大小。 - halfblood17
你确定你的imageView在移动吗?也许它有奇怪的内容适配问题。看一下UIView-contentMode-contentStretch属性。 - Zev Eisenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接