iOS 10 больше не может устанавливать цвет и оттенок полосы в MFMessageComposeViewController.

Код ниже работает на iOS версии 9.x или ниже, по какой-то причине это не работает, если iOS 10

 if([MFMessageComposeViewController canSendText])
             {
                 controller.body = message;
                 NSString *tel = pContact.tlc;
                 controller.recipients = pContact.tlc?@[tel]:nil;
                 controller.messageComposeDelegate = self;
                 controller.navigationBar.tintColor = [UIColor whiteColor];
                 controller.navigationBar.barTintColor = [UIColor blueColor];
                 [self presentViewController:controller animated:YES completion:nil];
             }

он сломан или что-то изменилось. Не уверен, что здесь не хватает. Я в темноте (черный как смоль)

РЕДАКТИРОВАТЬ: я попытался использовать некоторый тестовый код в новом пустом проекте с одним представлением, и у меня возникают те же проблемы.

@IBAction func SMS(_ sender: AnyObject) {
        let composeVC = MFMessageComposeViewController()
        composeVC.messageComposeDelegate = self

        // Configure the fields of the interface.
        composeVC.recipients = ["5555555555"]
        composeVC.body = "Hello from California!"
        composeVC.navigationBar.tintColor = UIColor.green
        composeVC.navigationBar.barTintColor = UIColor.purple
        // Present the view controller modally.
        self.present(composeVC, animated: true, completion: nil)
    } 

Изменить: внешний вид UINavigationBar может установить цвет в тестовом приложении для фона или barTint, но я все еще не могу установить цвет текста для тестового приложения. Приложение, над которым я работаю, уже использует внешний вид UINavigationBar для установки цвета панели навигации в приложении, но это не влияет на панель навигации для SMS, поскольку она имеет белый фон и белый текст. невозможно изменить цвет текста или цвет фона, что делает это представление непригодным для использования.


person Pascale Beaulac    schedule 12.09.2016    source источник
comment
У меня такая же проблема в моем приложении на iOS 10; Я пробовал много разных вещей и ничего не получалось.   -  person Matt DeWitt    schedule 14.09.2016


Ответы (4)


Проблема

  • По некоторым причинам в iOS10.x barTintColor не работает с некоторыми контейнерами общего доступа.
  • Но есть обходной путь, чтобы исправить цвет панели навигации во всех контейнерах общего доступа.

Решение

  • Используйте UINavigationBar.appearance(), чтобы изменить цвет панели навигации.
  • Используйте свойство backgroundColor и метод setBackgroundImage(_:for:), чтобы исправить цвет панели навигации.

Код

/// Method to set navigation bar color
func setNavigationBar() -> Void
{
    // barTintColor will apply color for the app's navigation bar
    UINavigationBar.appearance().barTintColor       = UIColor.blue

    // backgroundColor will apply color for some of the sharing container's app except for Messages app
    UINavigationBar.appearance().backgroundColor    = UIColor.blue

    // backgroundImage will apply the color image for navigation bar for most of the sharing container's except for `Notes`
    UINavigationBar.appearance().setBackgroundImage(UIImage(color: UIColor.blue), for:UIBarMetrics.default)
}

/// UIImage extension to create an image from specified color
extension UIImage
{
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}

Надеюсь, поможет!.

person Tesan3089    schedule 08.04.2017
comment
Большое спасибо, вы спасли мой день! ???????? - person Serzhas; 19.04.2018
comment
Спасибо, я действительно ломал голову над тем, как повлиять на внешний вид панели навигации при совместном использовании с помощью приложения сообщений. - person SteveOLeary; 25.04.2018

До iOS 10 я использовал внешний прокси для UINavigationBar, что-то вроде этого:

NSDictionary* titleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourNavBarTitle,
                                NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };

[[UINavigationBar appearance] setBarTintColor:[ColoursAndStyles sharedInstance].viewColourNavBarMain];
[[UINavigationBar appearance] setTintColor:[ColoursAndStyles sharedInstance].viewColourNavBarTint];
[[UINavigationBar appearance] setTitleTextAttributes:titleAttribs];

Это покрыло мое использование MFMessageComposeViewController, а setTitleTextAttributes позаботилось о цвете текста заголовка/подписи.

С iOS 10 я использую следующий обходной путь. Непосредственно перед представлением MFMessageComposeViewController я изменяю атрибуты текста заголовка. Например.:

- (void)sendTap:(id)s
{
    // some code...

    NSDictionary* newTitleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourTitleStrip,
                                       NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };

    [[UINavigationBar appearance] setTitleTextAttributes:newTitleAttribs];

    // present the MFMessageComposeViewController...
}

А затем верните все так, как я хочу, для остальной части приложения, когда MFMessageComposeViewController завершится, например:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
    NSDictionary* titleAttribs = @{ NSForegroundColorAttributeName: [ColoursAndStyles sharedInstance].fontColourNavBarTitle,
                                    NSFontAttributeName: [ColoursAndStyles sharedInstance].fontNavbarBoldTitle };

    [[UINavigationBar appearance] setTitleTextAttributes:titleAttribs];

    // some code...

    [controller dismissViewControllerAnimated:YES completion:^{
        // some code...
    }];
}
person Gavin Hope    schedule 20.10.2016

Это работает для меня, по крайней мере, для элементов заголовка и кнопки.

[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil].tintColor = [UIColor redColor];
[UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor redColor]};

Дополнительную информацию можно найти здесь: https://developer.apple.com/reference/uikit/uiappearance< /а>

Надеюсь это поможет. Ваше здоровье

person tico    schedule 15.12.2016
comment
это то, что мы пробовали, но в итоге мы смогли установить только 2 из двух цветов (текст/фон). так что придется жить с окном, которое на самом деле не подходит для приложения. - person Pascale Beaulac; 30.01.2017

Решение цели-C:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];

Изображение с цветовым методом:

+ (UIImage *)imageWithColor:(UIColor *)paramColor
{
    CGRect frame = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContextWithOptions(frame.size, NO, [UIScreen mainScreen].scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

    CGContextSetFillColorWithColor(context, [paramColor CGColor]);
    CGContextFillRect(context, frame);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
person Alex_Burla    schedule 15.08.2018