Как скрыть индикатор home для iPhone X при написании общего кода в делегате приложения - PullRequest
0 голосов
/ 23 апреля 2020

В моем проекте я хотел бы скрыть индикатор home без написания одного и того же кода в каждом контроллере представления и вместо этого реализовать его в appDelegate. Я пытался

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor yellowColor];
    return YES;
}

-(BOOL)prefersHomeIndicatorAutoHidden{
    return YES;
}

Я пытался так, но это не работает обычно. Так как же я могу скрыть индикатор home без записи в каждом контроллере представления и вместо этого реализовать из самого делегата приложения?

1 Ответ

1 голос
/ 23 апреля 2020

Есть способ выполнить sh это. На мой взгляд, он не самый элегантный, и я согласен с Gereon, что вам лучше создать подкласс UIViewController, реализовать его там, а затем все ваши контроллеры представления наследуются от этого базового класса.

Однако вы можете выполнить sh, используя метод Swizzling. Смотрите здесь: https://nshipster.com/method-swizzling/. В вашем случае вы можете переключить его в AppDelegate в application: didFinishLaunchingWithOptions: и переключить prefersHomeIndicatorAutoHidden в свою пользовательскую функцию, которая возвращает YES.

Так что для переключения я бы предложил создать новую категорию UIViewController. И собственно метель:

#import <objc/runtime.h>

@implementation UIViewController (Swizzling)

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        SEL originalSelector = @selector(prefersHomeIndicatorAutoHidden);
        SEL swizzledSelector = @selector(swizzledPrefersHomeIndicatorAutoHidden);
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        const BOOL didAdd = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (didAdd)
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        else
            method_exchangeImplementations(originalMethod, swizzledMethod);
    });
}

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES; //Doesn't matter what you return here. In this you could return the actual property value.
}

- (BOOL)swizzledPrefersHomeIndicatorAutoHidden //This is the actual `prefersHomeIndicatorAutoHidden ` call
{
    return YES;
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...