31

私のアプリケーションは、英語とアラビア語の両方にローカライズされています。

残念ながら、ローカライズの自動レイアウト動作が必要ない場合があります。つまり、先頭と末尾のスペースを逆にするということです。この動作をオーバーライドしたい。それを行う方法はありますか?

4

5 に答える 5

41

先頭を常に左 (および末尾を常に右) にする、つまり言語に依存しないようにするには、すべての制約の [言語の方向を尊重する] のチェックマークを外します。

このチェックマークは、「最初のアイテム」ボタンの下の属性インスペクターの制約設定にあります。

言語の指示を尊重する

于 2014-06-03T07:30:18.503 に答える
4

@Pavelの回答のように、「言語の方向を尊重する」プロパティをオフにする必要があります。制約が多い場合は、xib またはストーリーボード ファイルを XML ビューで開き、すべての「先頭」の値を「左」に、すべての「末尾」の値を「右」に置き換えれば完了です。

于 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 に答える