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では機能せず、常に次のようになります。
また、navigationBarにtintColor
属性を設定しようとしましたが、これも効果がありません。
navigationBar.tintColor = [UIColor redColor];
IOS 7のMFMailComposeViewControllerでナビゲーションボタンのテキストの色を変更する方法はありますか?
私はこれを使用し、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];
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]];
tintColorをUIWindowに設定すると、完全に正常に機能します、- 初めてMFMailComposerViewControllerを提示。後続の呼び出しでtintColor情報が失われるようです。
注:これにより、ウィンドウのすべての要素の色合いが変わります。
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
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)
}
何度か指摘されているように、MFMailComposeViewControllerナビゲーションバーの色合いの設定は機能しません。アプリ全体に他の外観の変更を設定している場合、色合いの色は問題の1つの側面にすぎません。このアプリでは、バーの色とUIBarButtonのテキストサイズを変更したため、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
を再度呼び出します。これは完全に機能します。