7

努力让我的应用程序同时在 iPhone 5 和较小的 iPhone 上运行。很高兴需要 iOS6 并使用 Autolayout,因为这很好用。

但是,该应用程序有 4 个按钮会定期交换位置,因此我为每个按钮分配了与数组不同的位置,然后使用以下内容为移动设置动画:

[UIView animateWithDuration:0.5 animations:^{
    button1.center = [[locations objectAtIndex:0] CGPointValue];
    button2.center = [[locations objectAtIndex:1] CGPointValue];
    button3.center = [[locations objectAtIndex:2] CGPointValue];
    button4.center = [[locations objectAtIndex:3] CGPointValue];
}];

这不适用于自动布局。没有什么变化。我得到的最好的结果是它会动画到一个位置然后立即弹回。

但是,当我删除 Autolayout 时,所有按钮都在较小的 iPhone 上被挤压,并且因为我使用的是由 iPhone 5 尺寸设置的点,所以它们最终会降低,将底行从屏幕上移开。我最初从 Interface Builder 获得了不同的 CGPoint 数字,但它们是“错误的”,尽管我认为它们是“错误的”,因为它们是 Autolayout 使用的数字。该数组只是为了让您可以看到:

buttonLocations = [NSArray arrayWithObjects:
        [NSValue valueWithCGPoint:CGPointMake(57, 523)],
        [NSValue valueWithCGPoint:CGPointMake(109, 523)],
        [NSValue valueWithCGPoint:CGPointMake(57, 471)],
        [NSValue valueWithCGPoint:CGPointMake(109, 471)],
        nil];

我应该怎么做才能解决这个问题?为每个尺寸的设备设置不同的点似乎不是很有效。

4

3 回答 3

12

解决方案是动画项目变换属性,而不是它的位置。

该位置将由自动布局设置,您不想与之抗争。然而,屏幕上的实际位置将是它的“正确”(由自动布局设置)位置,由它的 transform 属性偏移。

所以你可以说 button.transform = CGTransformMake(x,y) 它会出现 x 和 y 偏离它的中心位置。

有多种 CGWhatever 宏可以轻松进行这些转换,您只需在动画块中更改它们即可移动项目。

于 2013-06-06T23:28:37.507 回答
2

一种方法是使用自动布局系统,并为约束的“常量”值设置动画。在下面的示例代码中,我在水平行中有三个按钮,每个按钮都有一个对超级视图的前沿约束,这就是我制作的动画。side1、side2 和 side3 是这些约束的 IBOutlets,而 button1、button2 和 button3 是 3 个按钮的出口。

-(void)animateButton {
    [self.view removeConstraint:self.side1];
    [self.view removeConstraint:self.side2];
    [self.view removeConstraint:self.side3];

    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:114];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:213];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self.button3 attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:20];

    [self.view addConstraints:@[con1,con2,con3]];
    [UIView animateWithDuration:2 animations:^{
        [self.view layoutIfNeeded];
    }];
}
于 2012-12-14T18:03:33.547 回答
0

您可以通过对代码进行很少的更改来解决此问题。与其交换按钮位置,不如交换它们的布局约束。您可以使用 cocoapod SBP 通过导入此类别来交换布局约束

    #import "UIViewController+SBP.h"

然后用这个方法

    - (void)switchViewConst:(UIView*)firstView secondView:(UIView*)secondView durationInSeconds:(double)durationInSeconds

这是一个视频教程

于 2015-11-15T21:37:24.293 回答