web-dev-qa-db-ja.com

iOS7のMFMailComposerViewControllerでナビゲーションボタンの色を変更する

MFMailComposerViewControllerのナビゲーションボタンのテキストの色を変更しようとしていますが、iOS 6のように機能しません。iOS6では、次のようにUIAppearanceで機能しました。

// Navigation button
UIBarButtonItem *barButton = [UIBarButtonItem appearance];
NSDictionary *barButtonTitleTextAttributes = @{UITextAttributeTextColor: [UIColor redColor]};
NSDictionary *disabledBarButtonTitleTextAttributes = @{UITextAttributeTextColor: [UIColor grayColor]};

[barButton setTitleTextAttributes:barButtonTitleTextAttributes forState:UIControlStateNormal];
[barButton setTitleTextAttributes:disabledBarButtonTitleTextAttributes forState:UIControlStateDisabled];
[barButton setBackgroundImage:[[UIImage imageNamed:@"btn_appearance"] stretchableImageWithLeftCapWidth:6 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

しかし、これはiOS 7では機能せず、常に次のようになります。 enter image description here

また、navigationBarにtintColor属性を設定しようとしましたが、これも効果がありません。

navigationBar.tintColor = [UIColor redColor];

IOS 7のMFMailComposeViewControllerでナビゲーションボタンのテキストの色を変更する方法はありますか?

19
OemerA

私はこれを使用し、iOS7 +で完璧に動作します

MFMailComposeViewController* mailViewController = [[MFMailComposeViewController alloc] init];        
mailViewController.mailComposeDelegate = self;
[mailViewController setToRecipients:@[@"[email protected]"]];

[mailViewController.navigationBar setTintColor:[UIColor orangeColor]];

[self presentViewController:mailViewController animated:YES completion:nil]; 
35
Javi Campaña

OemerAが言うように-色を変える方法はありません。私の問題は、UIAppearanceでバーの背景色を青に設定して、「ボタン」が表示されなくなることでした。メールは実際にはアプリの一部ではないため、メールコンポーザーを作成する前にナグバーの外観をリセットする方が理にかなっています。これが私のやり方です:

// set to normal white
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], NSForegroundColorAttributeName, nil]];

MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];

// set to back to blue with white text
[[UINavigationBar appearance] setBarTintColor:[UIColor blueColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil]];
4
timosdk

tintColorUIWindowに設定すると、完全に正常に機能します、- 初めてMFMailComposerViewControllerを提示。後続の呼び出しでtintColor情報が失われるようです。

注:これにより、ウィンドウのすべての要素の色合いが変わります。

3
dlinsin

MFMailComposeViewControllerを表示して作成されたビュー階層を調べると、それが_UITextEffectsRemoteViewのインスタンス内に含まれていることがわかります。そのサブビューへのプログラムによるアクセスはゼロです。これは、サブビューがおそらく別のプロセスによって所有されているためだと思います。これらのサブビューは、さまざまなUIAppearanceプロキシ(バーの背景、titleTextAttributesなど)に設定されているものをすべて継承しますが、それ以上は継承しません。

UIAppearanceプロトコルは、ドキュメントでこれについて言及していませんが、ヘッダーファイルのコメントでこれを持っています:

Note for iOS7: On iOS7 the tintColor property has moved to UIView, and now has special inherited behavior described in UIView.h.
This inherited behavior can conflict with the appearance proxy, and therefore tintColor is now disallowed with the appearance proxy.

したがって、最終的な結果として、MFMailComposeViewControllerの外観のほとんどの側面を制御できますが、常にシステムのデフォルトの青みがかった色になります。

バグレポート: http://openradar.appspot.com/radar?id=6166546539872256

3
Ryan

Swift 3.

func sendEmail() {
    if MFMailComposeViewController.canSendMail() {
        let mail = MFMailComposeViewController()
        mail.navigationBar.tintColor = UIColor.red
        mail.mailComposeDelegate = self
        mail.setToRecipients(["[email protected]"])
        mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)

        present(mail, animated: true)
    } else {
        // show failure alert
    }
}

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    controller.dismiss(animated: true)
}
1
Abhishek Jain

何度か指摘されているように、MFMailComposeViewControllerナビゲーションバーの色合いの設定は機能しません。アプリ全体に他の外観の変更を設定している場合、色合いの色は問題の1つの側面にすぎません。このアプリでは、バーの色とUIBarButtonのテキストサイズを変更したため、MFMailComposeViewControllerでは次のように表示されます。 Navigation bar style in MFMailComposeViewController

アプリの外観は、AppDelegateから呼び出される関数configureAppearanceModifiersを使用してStyleGuideクラスで設定されます。

@timosdkの例をとって、2番目のメソッドを追加しました。

- (void)neutraliseAppearanceModifiers {

    [[UINavigationBar appearance] setTranslucent:NO];
    [[UINavigationBar appearance] setTintColor:nil];
    [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
    [[UINavigationBar appearance] setBackIndicatorImage:nil];
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:nil];
    [[UINavigationBar appearance] setBackgroundImage:nil
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateNormal];
    [[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateHighlighted];
    [[UIBarButtonItem appearance] setTitleTextAttributes:nil forState:UIControlStateDisabled];
    [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateNormal];
    [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateHighlighted];
    [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:nil forState:UIControlStateDisabled];

}

MFMailComposeViewControllerを初期化する前にこれを呼び出し、次にViewControllerを閉じる前にconfigureAppearanceModifiersデリゲートでdidFinishWithResultを再度呼び出します。これは完全に機能します。

1
Leon