web-dev-qa-db-ja.com

iOS 10は、MFMessageComposeViewControllerでバーカラーと色合いを設定できなくなりました

以下のコードはiOSバージョン9.x以下で機能します。何らかの理由で、iOS10の場合は機能しません。

 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のナビゲーションバーには影響しません。これは、白い背景と白いテキストが表示されるためです。テキストの色または背景色を変更できると、このビューは使用できなくなります。

21
Pascale Beaulac

問題

  • 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)
    }
}

それが役に立てば幸い!。

11
Tesan3089

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...
    }];
}
2
Gavin Hope

これは、少なくともタイトルとボタンのアイテムでは機能します。

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

ここで詳細情報を探してください: https://developer.Apple.com/reference/uikit/uiappearance

お役に立てれば。乾杯

1
tico

Objective-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;
}
0
Alex_Burla