禁用Autolayout本地化行为(RTL - 从右到左行为)

时间:2013-11-11 22:07:52

标签: ios objective-c iphone autolayout constraints

我的应用程序已本地化为英语和阿拉伯语。

不幸的是,有时不需要本地化的自动布局行为。通过这个,我的意思是反转前导和尾随空格。我想覆盖这种行为。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:33)

要使主导行为始终保持为左(并且尾随总是正确),即使其与语言无关,您可以删除"尊重语言方向"在所有约束。

您可以在属性检查器中的" First Item"下找到约束设置中的此复选标记。按钮。

Respect language direction

答案 1 :(得分:20)

属性leadingtrailingleftright相同,适用于从左到右的语言(如英语),但是从右到左希伯来语或阿拉伯语等环境leadingtrailingrightleft相同。创建约束时,leadingtrailing是默认值。您通常应该使用leadingtrailing来确保您的界面以所有语言正确布局,除非您制定的约束应该保持不变,无论语言如何。

因此,对于您的特殊情况,请不要使用leadingtrailing,而是在创建约束时明确使用leftright

答案 2 :(得分:4)

在@Pavel回答中,您应该关闭“尊重语言方向”#39;属性。如果你有很多约束,你可以在XML视图中打开xib或storyboard文件,并替换所有' leading'值为' left'以及所有'尾随'值为'对'而且你已经完成了。

答案 3 :(得分:2)

试试这个

  1. 在所有视图中创建用于管理约束的类
  2. @implementation RTLController
    
    #pragma mark - Public
    
    - (void)disableRTLForView:(UIView *)view
    {
        [self updateSubviewForParentViewIfPossible:view];
    }
    
    #pragma mark - Private
    
    - (void)updateConstraintForView:(UIView *)view
    {
        NSMutableArray *constraintsToRemove = [[NSMutableArray alloc] init];
        NSMutableArray *constraintsToAdd = [[NSMutableArray alloc] init];
    
        for (NSLayoutConstraint *constraint in view.constraints) {
    
            NSLayoutAttribute firstAttribute = constraint.firstAttribute;
            NSLayoutAttribute secondAttribute = constraint.secondAttribute;
    
            if (constraint.firstAttribute == NSLayoutAttributeLeading) {
                firstAttribute = NSLayoutAttributeLeft;
            } else if (constraint.firstAttribute == NSLayoutAttributeTrailing) {
                firstAttribute = NSLayoutAttributeRight;
            }
    
            if (constraint.secondAttribute == NSLayoutAttributeLeading) {
                secondAttribute = NSLayoutAttributeLeft;
            } else if (constraint.secondAttribute == NSLayoutAttributeTrailing) {
                secondAttribute = NSLayoutAttributeRight;
            }
    
            NSLayoutConstraint *updatedConstraint = [self constraintWithFirstAttribute:firstAttribute secondAtribute:secondAttribute fromConstraint:constraint];
            [constraintsToRemove addObject:constraint];
            [constraintsToAdd addObject:updatedConstraint];
    
        }
    
        for (NSLayoutConstraint *constraint in constraintsToRemove) {
            [view removeConstraint:constraint];
        }
        for (NSLayoutConstraint *constraint in constraintsToAdd) {
            [view addConstraint:constraint];
        }
    }
    
    - (void)updateSubviewForParentViewIfPossible:(UIView *)mainView
    {
        NSArray *subViews = mainView.subviews;
        [self updateConstraintForView:mainView];
    
        if (subViews.count) {
            for (UIView * subView in subViews) {
                [self updateConstraintForView:subView];
                [self updateSubviewForParentViewIfPossible:subView];
            }
        }
    }
    
    - (NSLayoutConstraint *)constraintWithFirstAttribute:(NSLayoutAttribute)firstAttribute secondAtribute:(NSLayoutAttribute)secondAttribute fromConstraint:(NSLayoutConstraint *)originalConstraint
    {
        NSLayoutConstraint *updatedConstraint =
        [NSLayoutConstraint constraintWithItem:originalConstraint.firstItem
                                     attribute:firstAttribute
                                     relatedBy:originalConstraint.relation
                                        toItem:originalConstraint.secondItem
                                     attribute:secondAttribute
                                    multiplier:originalConstraint.multiplier
                                      constant:originalConstraint.constant];
        return updatedConstraint;
    }
    @end
    
    1. 将此代码添加到应禁用RTL行为的控制器
    2. RTLController *rtl = [[RTLController alloc] init];
      [rtl disableRTLForView:self.view];
      

答案 4 :(得分:0)

另一种简单的方法

从故事板中选择任何视图

从右侧的属性检查器中选择将“语义”设置为“强制从左到右”