禁用Autolay本地化行为(RTL – 右起左行为)
我的申请本地化为英文和阿拉伯文。
不幸的是,有时候本地化的自动布局行为是不需要的。 我的意思是颠倒前后的空格。 我想重写这个行为。 有没有办法做到这一点?
为了使主导行为总是像左边那样(并且总是像右边那样),即使它与语言无关,可以去除所有约束上的“尊重语言方向”上的复选标记。
您可以在属性检查器中的“第一项”button下的约束设置中find此复选标记。
leading
和trailing
的属性与从左到右的语言(如英语)的left
和right
相同,但是在从右到左的环境(如希伯来语或阿拉伯语)中, leading
和trailing
与right
和left
相同。 创build约束时, leading
和trailing
是默认值。 您通常应该使用leading
和trailing
,以确保您的界面在所有语言中都能正确布局,除非您制定的约束条件应该与语言无关。
因此,对于您的特殊情况,请勿使用leading
和trailing
,而应在创build约束时明确使用left
和right
。
如在@Pavel答案中,您应该closures“尊重语言方向”属性。 如果您有许多限制条件,可以在XML视图中打开xib或storyboard文件,并用“right”replace所有的“leading”值,并用“right”replace所有的“trailing”值,这样就完成了。
尝试这个
- 在所有视图中创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
- 将此代码添加到应禁用RTL行为的控制器中
RTLController *rtl = [[RTLController alloc] init]; [rtl disableRTLForView:self.view];