禁用Autolay本地化行为(RTL – 右起左行为)

我的申请本地化为英文和阿拉伯文。

不幸的是,有时候本地化的自动布局行为是不需要的。 我的意思是颠倒前后的空格。 我想重写这个行为。 有没有办法做到这一点?

为了使主导行为总是像左边那样(并且总是像右边那样),即使它与语言无关,可以去除所有约束上的“尊重语言方向”上的复选标记。

您可以在属性检查器中的“第一项”button下的约束设置中find此复选标记。

尊重语言方向

leadingtrailing的属性与从左到右的语言(如英语)的leftright相同,但是在从右到左的环境(如希伯来语或阿拉伯语)中, leadingtrailingrightleft相同。 创build约束时, leadingtrailing是默认值。 您通常应该使用leadingtrailing ,以确保您的界面在所有语言中都能正确布局,除非您制定的约束条件应该与语言无关。

因此,对于您的特殊情况,请勿使用leadingtrailing ,而应在创build约束时明确使用leftright

如在@Pavel答案中,您应该closures“尊重语言方向”属性。 如果您有许多限制条件,可以在XML视图中打开xib或storyboard文件,并用“right”replace所有的“leading”值,并用“right”replace所有的“trailing”值,这样就完成了。

尝试这个

  1. 在所有视图中创build用于pipe理约束的类
 @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行为的控制器中
 RTLController *rtl = [[RTLController alloc] init]; [rtl disableRTLForView:self.view];