UIDocumentInteractionController с полупрозрачной панелью навигации

Ааа, я схожу с ума... Я часами пытаюсь заставить NavigationBar моего UIDocumentInteractionController НЕ быть полупрозрачным, но ничего не работает..

Он представлен в качестве предварительного просмотра

_docController = [UIDocumentInteractionController new];
_docController.delegate = self;
[_docController setURL:[NSURL fileURLWithPath:_attachmentPath]];
[_docController presentPreviewAnimated:YES];

Затем я попытался назначить NavigationController из исходного ViewController (который не является полупрозрачным):

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {
    return [self navigationController];
}

Это не сработало... NavigationBar в DocumentPreview по-прежнему полупрозрачный.

ОК, поэтому я попытался манипулировать панелью навигации:

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {

    UINavigationController *nc = [self navigationController];

    [nc.navigationBar setAlpha:1.0];
    [nc.navigationBar setTranslucent:NO];
    [nc.navigationBar setOpaque:NO];
    [nc.navigationBar setBarStyle:UIBarStyleBlack];

    return nc;

}

То же самое, NavigationBar по-прежнему полупрозрачный. Затем я попытался изменить внешний вид всего приложения в AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [[UINavigationBar appearance] setTranslucent:NO];

}

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

Это ошибка? Или ты знаешь как я мог решить эту проблему?

--- Мое решение ---

Поскольку я не нашел универсального решения, я теперь нашел обходной путь, добавив черное подпредставление под панелью навигации:

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {

    UINavigationController *nc = [self navigationController];

    CGFloat navbarHeight = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height;

    CGRect xFrame = CGRectMake(0.0f,
                               0.0f,
                               self.view.frame.size.width,
                               navbarHeight);

    UIView *blackView = [[UIView alloc] initWithFrame:xFrame];
    blackView.backgroundColor = [UIColor blackColor];

    [nc.view insertSubview:blackView atIndex:1];

    return nc;

}

Не лучшее решение, но оно работает...

1 ответ

Вы можете дать ViewController вместо NavigationController. Используя приведенный ниже код UIDocumentInteractionController присутствует на текущем ViewController.

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
    [[UINavigationBar appearance] setTintColor:self.navigationController.navigationBar.tintColor];
    [[UINavigationBar appearance] setBarTintColor:self.navigationController.navigationBar.barTintColor];
    [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:self.navigationController.navigationBar.tintColor}];
    [[UINavigationBar appearance] setBackgroundImage:[self.class imageFromColor:self.navigationController.navigationBar.barTintColor] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setTranslucent:false];
    return  self;
}
+ (UIImage *)imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

setTranslucent = false, работа над представленным UIDocumentInteractionController.

Другие вопросы по тегам