我的应用程序本地化为英语和阿拉伯语。
不幸的是,有时不需要本地化的自动布局行为。我的意思是颠倒前导和尾随空格。我想覆盖这种行为。有没有办法做到这一点?
我的应用程序本地化为英语和阿拉伯语。
不幸的是,有时不需要本地化的自动布局行为。我的意思是颠倒前导和尾随空格。我想覆盖这种行为。有没有办法做到这一点?
要使前导始终像左(并且尾随始终像右),即使其与语言无关,您可以在所有约束上删除“尊重语言方向”上的复选标记。
您可以在“第一项”按钮下的属性检查器的约束设置中找到此复选标记。
属性leading
和trailing
与从左到右的语言(如英语)相同,但在从右到左的环境(如希伯来语或阿拉伯语)left
中,与和相同。创建约束时,和是默认值。您通常应该使用and来确保您的界面在所有语言中都进行了适当的布局,除非您正在制定无论语言如何都应该保持不变的约束。right
leading
trailing
right
left
leading
trailing
leading
trailing
因此,对于您的特殊情况,不要使用leading
and trailing
,而是在创建约束时显式使用left
and 。right
正如@Pavel 的回答一样,您应该关闭“尊重语言方向”属性。如果您有很多限制,您可以在 XML 视图中打开 xib 或故事板文件,并将所有“前导”值替换为“左”,将所有“尾随”值替换为“右”,然后就完成了。
试试这个
@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];
另一种简单的方法
从情节提要中选择任何视图
从右侧的属性检查器中选择将“语义”设置为“强制从左到右”