1

当我的应用程序处于横向与纵向模式时,我试图在不同的位置显示一组图像。我已经搜索并找到了对该willAnimateRotationToInterfaceOrientation:duration方法的引用,我在其中添加了如下代码:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.getStartedImage1.frame = CGRectMake(5, 100, 155, 115);
        self.getStartedImage2.frame = CGRectMake(160, 100, 155, 115);
        self.getStartedImage3.frame = CGRectMake(315, 100, 155, 115);
    }
    else
    {
        self.getStartedImage1.frame = CGRectMake(238, 96, 155, 115);
        self.getStartedImage2.frame = CGRectMake(238, 219, 155, 115);
        self.getStartedImage3.frame = CGRectMake(238, 342, 155, 115);
    }
}

这很有效,直到我意识到如果您在横向模式下进入视图,该方法将不会运行。这是有道理的,因为我在不旋转任何东西的情况下打开视图。但是,这对我的困境没有帮助。所以我继续我的搜索并找到了方法viewWillLayoutSubviews。我在这个方法中添加了相同的主体,它被调用了,但可能为时已晚,因为对图像帧的更改没有出现在模拟器中。如果我尝试将代码移动到viewWillAppear. 我见过一些涉及多个视图的复杂解决方案,我宁愿避免。有什么建议么?

4

1 回答 1

1

这听起来像你在战斗autolayout。我能想到三个解决方案。

  1. 关掉autolayout。如果您已经自己管理所有视图框架,那么这可能是正确的路径。

  2. 将您的布​​局代码移动到-viewDidLayoutSubviews. 这是hacky但很快。它还允许主要autolayout做这件事。

  3. 交换适用的旋转约束。这将是最多的工作,但从长远来看,对于诸如国际化之类的事情来说,这可以说是最灵活的。

关于第三点:

约束 ( NSLayoutConstraints) 是可以在 IB 和代码中检查和编辑的真实对象。由于布局可能非常复杂,这里有一个非常简单的示例。假设我的视图控制器视图中有两个按钮,一个在另一个之上(连接到两个插座buttonOnebuttonTwo),并且我想在横向方向反转它们的位置。像这样的代码(虽然不建议采用这种形式)确实有效,并提供了一个如何交换约束的示例。

@implementation MyAutoViewController {
    NSArray *_portraitConstraints;
    NSArray *_landscapeConstraints;
}
-(void)viewDidLoad{
    [super viewDidLoad];

    // Clear constraints from Nib. 
    // PLEASE DO NOT DO THIS PART IN REAL LIFE
    NSArray *current = self.view.constraints;
    for (NSLayoutConstraint *contsra in current) {
        [self.view removeConstraint:contsra];
    }

    // Set up views dictionary
    UIButton *buttonOne = self.buttonOne;
    UIButton *buttonTwo = self.buttonTwo;
    NSDictionary *viewsDict = NSDictionaryOfVariableBindings(buttonOne, buttonTwo);

    // Set distance from left to both buttons to standard space
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonOne]" options:0 metrics:nil views:viewsDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonTwo]" options:0 metrics:nil views:viewsDict]];

    // HERE IS WHERE IT GETS INTERESTING
    // ### Create portrait constraints ###
    _portraitConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonOne]-[buttonTwo]" options:0 metrics:nil views:viewsDict];

    // ### Create landscape constraints ###
    _landscapeConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonTwo]-[buttonOne]" options:0 metrics:nil views:viewsDict];

    // Add the appropriate constraints
    [self.view addConstraints:(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))?_portraitConstraints:_landscapeConstraints];

}
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){
        [self.view removeConstraints:_landscapeConstraints];
        [self.view addConstraints:_portraitConstraints];
    } else {
        [self.view removeConstraints:_portraitConstraints];
        [self.view addConstraints:_landscapeConstraints];
    }
}

我真的建议观看autolayoutWWDC2012 上的三个视频。Autolayout有很多事情要做。

于 2013-03-20T20:57:24.697 回答