我的应用程序已本地化为英语和阿拉伯语。
不幸的是,有时不需要本地化的自动布局行为。通过这个,我的意思是反转前导和尾随空格。我想覆盖这种行为。有没有办法做到这一点?
答案 0 :(得分:33)
要使主导行为始终保持为左(并且尾随总是正确),即使其与语言无关,您可以删除"尊重语言方向"在所有约束。
您可以在属性检查器中的" First Item"下找到约束设置中的此复选标记。按钮。
答案 1 :(得分:20)
属性leading
和trailing
与left
和right
相同,适用于从左到右的语言(如英语),但是从右到左希伯来语或阿拉伯语等环境leading
和trailing
与right
和left
相同。创建约束时,leading
和trailing
是默认值。您通常应该使用leading
和trailing
来确保您的界面以所有语言正确布局,除非您制定的约束应该保持不变,无论语言如何。
因此,对于您的特殊情况,请不要使用leading
和trailing
,而是在创建约束时明确使用left
和right
。
答案 2 :(得分:4)
在@Pavel回答中,您应该关闭“尊重语言方向”#39;属性。如果你有很多约束,你可以在XML视图中打开xib或storyboard文件,并替换所有' leading'值为' left'以及所有'尾随'值为'对'而且你已经完成了。
答案 3 :(得分: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
RTLController *rtl = [[RTLController alloc] init]; [rtl disableRTLForView:self.view];
答案 4 :(得分:0)
另一种简单的方法
从故事板中选择任何视图
从右侧的属性检查器中选择将“语义”设置为“强制从左到右”