iOS: как программно изменить пользовательский интерфейс с LTR на RTL и наоборот - PullRequest
0 голосов
/ 02 февраля 2019

Мне нужно изменить язык с английского на арабский.Все пользовательские интерфейсы в приложении разрабатывались программно, я не использовал раскадровку / XIB для пользовательского интерфейса.Я использовал строку локализации для преобразования языка, но я ищу представление пользовательского интерфейса от LTR к RTL и наоборот.

, что является лучшим способом для изменения языка и дает мне несколько идей или примеров

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете проверить текущий язык следующим образом:

open class func isCurrentLanguageRTL(language:String) -> Bool {
        return Locale.characterDirection(forLanguage: language) == .rightToLeft
    }

Используйте этот целевой код C (Категория), чтобы изменить свой RTL пользовательского интерфейса:

#import <Foundation/Foundation.h>


@interface NSBundle (Language)

+ (void)setLanguage:(NSString *)language;

@end

Файл реализации:

#import "NSBundle+Language.h"
#import <UIKit/UIKit.h>
#import <objc/runtime.h>

static const char kBundleKey = 0;

@interface BundleEx : NSBundle

@end

@implementation BundleEx

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle *bundle = objc_getAssociatedObject(self, &kBundleKey);
    if (bundle) {
        return [bundle localizedStringForKey:key value:value table:tableName];
    }
    else {
        return [super localizedStringForKey:key value:value table:tableName];
    }
}

@end


@implementation NSBundle (Language)

+ (void)setLanguage:(NSString *)language
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        object_setClass([NSBundle mainBundle], [BundleEx class]);
    });
    if ([self isCurrentLanguageRTL:language]) {
        if ([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) {
            [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];
            [[UITableView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];
            [[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];
        }
    }else {
        if ([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) {
            [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
            [[UITableView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
            [[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:[self isCurrentLanguageRTL:language] forKey:@"AppleTextDirection"];
    [[NSUserDefaults standardUserDefaults] setBool:[self isCurrentLanguageRTL:language] forKey:@"NSForceRightToLeftWritingDirection"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    id value = language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil;
    objc_setAssociatedObject([NSBundle mainBundle], &kBundleKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

+ (BOOL)isCurrentLanguageRTL:(NSString *)code
{
    return ([NSLocale characterDirectionForLanguage:code] == NSLocaleLanguageDirectionRightToLeft);
}
@end

Как использовать:

Любой тип языка (например, RTL, LTR) вызывает только эту функцию пакетав вашем коде:

Bundle.setLanguage(<#Your Language code#>)

Примечание: Вы должны добавить #import "NSBundle+Language.h" в заголовочный файл моста.

Если вы используете левое меню, чем в случаеRTL, вы должны открыть меню справа, просто проверив вышеуказанную функцию swift, как:

<#YourClass#>.isCurrentLanguageRTL(<#Your Language Code#>) {
  //open your side menu from right
}
...