31

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

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

4

5 回答 5

41

要使前导始终像左(并且尾随始终像右),即使其与语言无关,您可以在所有约束上删除“尊重语言方向”上的复选标记。

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

尊重语言方向

于 2014-06-03T07:30:18.503 回答
23

属性leadingtrailing与从左到右的语言(如英语)相同,但在从右到左的环境(如希伯来语或阿拉伯语)left中,与和相同。创建约束时,和是默认值。您通常应该使用and来确保您的界面在所有语言中都进行了适当的布局,除非您正在制定无论语言如何都应该保持不变的约束。rightleadingtrailingrightleftleadingtrailingleadingtrailing

因此,对于您的特殊情况,不要使用leadingand trailing,而是在创建约束时显式使用leftand 。right

于 2013-11-15T15:04:04.063 回答
4

正如@Pavel 的回答一样,您应该关闭“尊重语言方向”属性。如果您有很多限制,您可以在 XML 视图中打开 xib 或故事板文件,并将所有“前导”值替换为“左”,将所有“尾随”值替换为“右”,然后就完成了。

于 2015-08-18T07:33:11.247 回答
2

试试这个

  1. 创建用于管理所有视图中的约束的类
@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];
于 2015-08-02T18:43:39.057 回答
0

另一种简单的方法

从情节提要中选择任何视图

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

于 2021-02-06T01:03:55.780 回答