9

我开始使用Rory Lewis 为 Absolute Beginners 编写的 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 引起的问题。一旦被禁用,一切都很顺利;)

4

3 回答 3

9

如果您正在转换一个由自动布局管理的视图您可能会遇到一些奇怪的副作用。有关更多详细信息,请参阅此答案。

我最终采用的解决方案是将要转换的视图封装在另一个大小完全相同的视图中。外部视图应用了适当的布局约束,而内部视图只是在其容器中居中。将CGAffineTransform比例变换应用到内部视图现在可以正确居中。

于 2014-09-11T00:22:22.837 回答
8

老问题......但以防万一其他人来看:

CGAffineTransform围绕锚点的行为(旋转、缩放)。

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

锚点是图层的一部分

所以如果你有一个UIImageView被调用的imageview,你会像这样调用来将锚点设置到 imageview 的中心:

[imageview.layer setAnchorPoint:CGPointMake(0.5, 0.5)];
于 2013-03-25T04:54:21.567 回答
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

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

于 2012-12-04T15:34:03.497 回答