Отключить поведение локализации при автоопределении (RTL - право на левое поведение)
Мое приложение локализовано на английском и арабском языках.
К сожалению, иногда поведение автоопределения для локализации не требуется. Под этим я подразумеваю обратное перемещение ведущего и конечного пробелов. Я хочу переопределить это поведение. Есть ли способ сделать это?
Ответы
Ответ 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
- Добавьте этот код в контроллер, который должен отключить поведение RTL.
RTLController *rtl = [[RTLController alloc] init];
[rtl disableRTLForView:self.view];