Подтвердить что ты не робот

Отключить поведение локализации при автоопределении (RTL - право на левое поведение)

Мое приложение локализовано на английском и арабском языках.

К сожалению, иногда поведение автоопределения для локализации не требуется. Под этим я подразумеваю обратное перемещение ведущего и конечного пробелов. Я хочу переопределить это поведение. Есть ли способ сделать это?

4b9b3361

Ответ 1

Чтобы сделать ведущий акт всегда как левым (и всегда заканчивающимся как правое), т.е. сделать его независимым от языка, вы можете удалить галочку на "Respect language direction" для всех ограничений.

Этот флажок можно найти в настройках ограничения в инспекторе атрибутов в разделе "Первый элемент".

Respect language direction

Ответ 2

Атрибуты leading и trailing такие же, как left и right для языков слева направо, таких как английский, но в среде справа налево, такой как иврит или арабский, leading и trailing совпадают с right и left. Когда вы создаете ограничения, значения leading и trailing являются значениями по умолчанию. Обычно вы должны использовать leading и trailing, чтобы убедиться, что ваш интерфейс правильно размещен на всех языках, если только вы не создаете ограничений, которые должны оставаться неизменными независимо от языка.

Итак, для ваших особых случаев не используйте leading и trailing, вместо этого явно используйте left и right при создании своих ограничений.

Ответ 3

как в ответе @Pavel, вы должны отключить свойство "Соблюдать языковое направление". если у вас много ограничений, вы можете открыть файл xib или раскадровки в представлении XML и заменить все "ведущие" значения на "left" и "trailing" values ​​на "right", и все готово.

Ответ 4

Попробуйте это

  • Создать класс для управления ограничениями во всех представлениях
@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];