IOS 10 больше не может устанавливать штрих-код и оттенок на MFMessageComposeViewController

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

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

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

EDIT: Я попытался использовать некоторый тестовый код в новом пустом проекте с одним представлением, и у меня возникают те же проблемы.

@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, поскольку она выглядит на белом фоне и белом тексте. неспособный изменить цвет текста или цвет фона, делает это представление непригодным для использования.

Ответы

Ответ 1

Вопрос

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

Решение

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

код

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

    // backgroundColor will apply color for some of the sharing container 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 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)
    }
}

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

Ответ 2

До 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...
    }];
}

Ответ 3

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

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

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

Надеюсь, это поможет. Приветствия