2012-12-04 37 views
9

我开始使用iPhone and iPad apps for Absolute Beginners by Rory Lewis书研究objective-c,但我陷入了第5章。CGAffine转换并缩放到图像的中心

我想制作缩小图像的按钮。
我的问题是,在我编写所有代码后,图像缩小到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

您可以发布您使用的代码吗? –

+0

编辑代码;) – halfblood17

回答

7

如果您正在转换视图 受自动布局管理的损坏 ,您可能会遇到一些奇怪的副作用。See this answer for more details.

我最终采用的解决方案是封装我想在完全相同大小的另一视图中转换的视图。外部视图具有适当的布局约束,而内部视图仅在其容器中居中。现在将适当的CGAffineTransform缩放比例转换为内部视图。

+0

谢谢,这帮了我很多! – aparesidam

6

尝试是这样的:

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

你必须学习自动布局和自动调整如何影响你的观点。在上面的项目中都禁用,让你看看它是如何工作的。

+0

我已经按照你所说的做了,但如果我打印的值为 'myImage.center.x'和'myImage.center.y',它会一直指向左上角。 我已经尝试了3次重新启动项目,并且仍然存在相同的问题,甚至只写了缩小按钮的代码。如果(hasMoved == NO && hasShrink == NO){ [UIView beginAnimations:nil context:nil];(IBAction)缩小:(id)发送者。 [UIView setAnimationDuration:1.0]; _myIcon.transform = sizeShrink; hasShrink = YES; [UIView commitAnimations];' – halfblood17

+0

如果你使用的代码你没有做我说的。请更新与您的来源的问题,不要添加评论(难以阅读,而不是正确的地方)。 – djromero

+0

好的,我会解决这个问题。但我仍然试图只使用你的代码,没有任何改变。它仍然在移动时调整大小。 – halfblood17

8

老问题...但以防万一别人来找:

CGAffineTransform行为(旋转,缩放)围绕anchorPoint。

如果您调整为0,0,则将您的锚点设置为0,0。如果您希望将其大小设置为不同的点(例如图像中心),则需要更改锚点。

的锚是层

所以的一部分,如果你有一个UIImageViewimageview,你会拨打电话这样的锚设定的ImageView的中心:

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

'anchorPoint'以相对值进行度量,默认为0.5,0.5,这是视图的中心。使用像素值不会给你预期的结果。 – devios1

+0

谢谢...好点! – HalR