68

iOS7 でアイテムを共有するために UIActivityViewController を使用しています。メールオプションをタップすると、メールコンポーザーがポップアップしますが、ナビゲーションバーのキャンセルボタンと送信ボタン、およびナビゲーションバー自体が青色で非常に読みにくいので、色を変更したいと思います。iOS6 では動作しますが、iOS7 では動作しません。

私は試した

[[UIBarButtonItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor], UITextAttributeTextColor, [UIColor clearColor], UITextAttributeTextShadowColor, nil] forState:UIControlStateNormal];

これはiOS6で動作し、私は試しました

[[UIBarButtonItem appearance] setTintColor:[UIColor redColor]];
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

これにより、アプリが初めて実行されたときに色が赤く点滅し、すぐに青色に戻ります。

4

20 に答える 20

76

から表示されたときに、 ( SendCancelの両方)および(Cancelのみ)にあるSendボタンとCancelボタンのテキストの色を変更することができました。UINavigationBarMFMailComposerViewControllerMFMessageComposeViewControllerUIActivityViewController

UIActivityViewController を使用して、MessageまたはをタップしMailます。

UIActivityViewController の使用

[送信] ボタンと[キャンセル] ボタンのデフォルトのテキストの色は青です。

デフォルトの青色

これを変更するには、AppDelegate.mクラスのdidFinishLaunchingWithOptionsメソッドに次の行を挿入します。

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:[UIColor whiteColor]];

これにより、次の結果が得られます。

白に変更

次のように、他の色を使用することもできます。

[UIColor purpleColor];

紫に変更

[UIColor greenColor];

緑に変わりました

これをどのようにテストしましたか?このソリューションは次の場合に機能することに気付きました。

  • Xcode 5.1 で、iOS 7.1 シミュレーターで、ベース iOS SDK 7.1 としてビルド (プロジェクト ファイルの選択 -> ビルド設定 -> ベース SDK から選択できます。また、一般 -> デプロイ ターゲット -> 7.1 から選択)
  • iPhone 4 で Xcode 5.1 を使用し、ベース iOS SDK 7.0 としてビルド (プロジェクト ファイルの選択 -> ビルド設定 -> ベース SDK から選択できます。また、一般 -> デプロイ ターゲット -> 7.0 から選択)
  • iPhone 4 で Xcode 5.1 を使用し、ベース iOS SDK 7.1 としてビルド (プロジェクト ファイルの選択 -> ビルド設定 -> ベース SDK から選択できます。また、一般 -> デプロイ ターゲット -> 7.1 から選択)

以下でテストしたときは機能しませんでした:

  • Xcode 5.1 で、iOS 7.0 シミュレーターで、ベース iOS SDK 7.0 としてビルド (プロジェクト ファイルの選択 -> ビルド設定 -> ベース SDK から選択できます。また、一般 -> デプロイ ターゲット -> 7.0 から選択)

したがって、iOS シミュレーターでの動作よりも実際のデバイスでの動作の方が重要であると考えているため、安全に使用できるはずです。iOS 7.0 シミュレーターで動作しない理由を誰かが知っている場合は、知りたいです。:)

于 2014-04-12T19:34:07.333 に答える
25

UIActivityViewController のバーの色合いとステータス バーの色。Swift 3 ソリューション:

extension MFMailComposeViewController {
    override open func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
    }

    open override func viewDidLoad() {
        super.viewDidLoad()
        navigationBar.isTranslucent = false
        navigationBar.isOpaque = false
        navigationBar.barTintColor = UIColor.white
        navigationBar.tintColor = UIColor.white
    }
}
于 2016-10-07T21:21:24.540 に答える
6

これは、今日の時点で iOS 7.1 で動作するものです。

UIActivityViewController をサブクラス化し、次のメソッドをオーバーライドします。

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    viewControllerToPresent.view.tintColor = [UIColor whiteColor];

    [super presentViewController:viewControllerToPresent animated:flag completion:^{
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

        if (completion) {
            completion();
        }
    }];
}

これにより、ボタンが白くなり、ステータス バーが白くなります。

于 2014-08-27T15:22:26.933 に答える
4

スイフトの場合:

self.navigationController?.presentViewController(activityViewController, animated: true, completion: { () in
   UIBarButtonItem.appearance().tintColor = UIColor.whiteColor()
   UINavigationBar.appearance().barTintColor = UIColor.whiteColor() // optional to change bar backgroundColor           
}

これにより、[送信] ボタンと [キャンセルUIActivityViewController] ボタンの色が白に変更されます (iOS 7,8 でテスト済み) が、ステータス バーのテキストの色を白にすることはまだできません。

于 2015-02-17T10:31:28.613 に答える
3

これは iOS 7 のバグのようです。オンラインでこれに関する他の報告を見ました。また、iOS 7.1 では修正されていないようです。

具体的に言うと、UIActivityViewController から表示されるダイアログのナビゲーション バーに、何をしても色合いを設定することはできません。

于 2014-03-27T12:37:56.183 に答える
3

外観プロキシのおかげで、tintColorプロパティがどこでも白であるアプリで同じ問題が発生しました。UINavigationBarその結果UIBarButtonItem、メール コンポーザー ビュー コントローラーからナビゲーション バーが表示されなくなります (白いナビゲーション バーに白いボタンが表示されます)。

application:didFinishLaunchingWithOptions:メソッドに次の呼び出しがあります。

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

UINavigationBarでメール コンポーザー ビュー コントローラーにアクセスすることは (今のところ?) 不可能であるためUIActivityViewController、Alex の回答に触発された次の回避策を実行しました。

UIColor *normalColor = [[UINavigationBar appearance] tintColor];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];
            [activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
                // back to normal color
                [[UINavigationBar appearance] setTintColor:normalColor];
            }];
            [self presentViewController:activityViewController animated:YES completion:^{
                // change color temporary
                [[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:232.0f/255.0f green:51.0f/255.0f blue:72.0f/255.0f alpha:1.0f]];
            }];

PS: このコードは iOS 7 を対象としていますが[[UIBarButtonItem appearance] setTintColor:]、iOS 6 でも使用できます (Kevin van Mierlo の回答を参照)。

于 2014-05-20T14:44:17.940 に答える
1

これは私にとってはうまくいきました:関数の AppDelegate.m で:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

次のコードを入力しました。

//mail composer
[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setBarTintColor:myBackgroundColor];
[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setTintColor:myBarItemsColor];

iOS7 + iOS8 で問題なく動作しますが、新しいバージョンは試していません

于 2014-08-10T07:31:37.467 に答える
1

アレックスのソリューションを機能させることができませんでしたが、私の状況では barTintColor と titleTextAttributes の両方を設定する必要がありましたが、Paillou の回答のバリエーションを機能させることができました。

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];

activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToVimeo, UIActivityTypePostToFlickr, UIActivityTypeAirDrop];

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
    // back to normal color
    [[UINavigationBar appearance] setBarTintColor:AAColorInputBorder];
    [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                         [UIFont fontWithName:@"Avenir-Medium" size:18], NSFontAttributeName,
                                                         [UIColor whiteColor], NSForegroundColorAttributeName,
                                                         nil]];
}];

[self presentViewController:activityViewController animated:YES completion:^{
// change color temporary
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                     [UIFont fontWithName:@"Avenir-Medium" size:18], NSFontAttributeName,
                                                     AAColorInputBorder, NSForegroundColorAttributeName,
                                                     nil]];

ありがとうパイユ!

于 2014-07-09T01:10:06.157 に答える
1

iOS 7 でキャンセル ボタンと送信ボタンの色を設定する場合は、次のようにします。

// Change the colours of the buttons in iOS 7
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];

iOS 6 では実際にこれらであり、これもコードに残す必要があります。

// Change the colours of the buttons in iOS 6
[[UIBarButtonItem appearance] setTintColor:[UIColor redColor]];

// Change the color of the the navigation bar in iOS 6 and 7
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
于 2013-11-21T12:19:22.143 に答える
1

Apple のコードの UI をそのまま変更できないのには理由があります。主にリンゴだからです。MFMailComposerViewController の UI の外観を編集することはできません。方法があれば、私はそれについての手がかりはありませんが、それを行う方法を見たことがありません. MFMailComposeViewController は iOS 3.0 で作成されたので、appearance 属性をサポートしておらず、iOS 5.0 まで外観は問題になりませんでした。

MFMailComposeViewController Apple ドキュメントへのリンクは次のとおりです: MFMailComposeViewController

お役に立てれば!

于 2013-11-15T15:33:13.570 に答える
0

Swift では、次の拡張機能を作成しましたUIViewController

extension UIViewController {

    func presentActivityViewController(viewControllerToPresent: UIViewController) {
        self.presentViewController(viewControllerToPresent, animated: true) { _ in
            UIBarButtonItem.appearance().tintColor = UIColor.whiteColor()
            UINavigationBar.appearance().barTintColor = Config.primaryColor
        }
    }
}

UIActivityViewController を提示する必要があるときは、次のように呼び出します。

    let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: [])
    presentActivityViewController(activityViewController)
于 2016-04-13T14:16:06.530 に答える
0

Swiftでは、iOS9では、設定

UINavigationBar.appearance().barTintColor = UIColor.greenColor() // eg
UINavigationBar.appearance().translucent = false

アクティビティビューコントローラーを提示する前に、私にとってはうまくいきました。

于 2016-07-18T12:41:49.527 に答える
0

特にMFMailComposeViewController/MFMessageViewController自体が によって表示される場合、これには大きな問題がありましたUIActivityViewController

https://github.com/rentzsch/jrswizzleの助けを借りて、アプリの色とフォントのカスタマイズを元に戻し、やり直すためにviewDidAppear/でメソッドのスウィズリングを使用することに頼りました。viewDidDisappear

SwizzledComposeViewControllers.h

#import <MessageUI/MessageUI.h>

@interface MFMailComposeViewController (GMSwizzling)
@end

@interface MFMessageComposeViewController (GMSwizzling)
@end

SwizzledComposeViewControllers.m

#import "SwizzledComposeViewControllers.h"
#import "AppDelegate.h"
#import "JRSwizzle.h"

@implementation MFMailComposeViewController (GMSwizzling)

+ (void)load {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    [self jr_swizzleMethod:@selector(init) withMethod:@selector(gmswizzled_init) error:nil];
    [self jr_swizzleMethod:@selector(viewWillAppear:) withMethod:@selector(gmswizzled_viewWillAppear:) error:nil];
    [self jr_swizzleMethod:@selector(viewWillDisappear:) withMethod:@selector(gmswizzled_viewWillDisappear:) error:nil];
  });
}

- (instancetype)gmswizzled_init {
  [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance];
  return [self gmswizzled_init];
}

- (void)gmswizzled_viewWillAppear:(BOOL)animated {
  [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance];
  [self gmswizzled_viewWillAppear:animated];
}

- (void)gmswizzled_viewWillDisappear:(BOOL)animated {
  [(AppDelegate*)UIApplication.sharedApplication.delegate customiseAppearance];
  [self gmswizzled_viewWillDisappear:animated];
}

@end


@implementation MFMessageComposeViewController (GMSwizzling)

+ (void)load {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    [self jr_swizzleMethod:@selector(init) withMethod:@selector(gmswizzled_init) error:nil];
    [self jr_swizzleMethod:@selector(viewWillAppear:) withMethod:@selector(gmswizzled_viewWillAppear:) error:nil];
    [self jr_swizzleMethod:@selector(viewWillDisappear:) withMethod:@selector(gmswizzled_viewWillDisappear:) error:nil];
  });
}

- (instancetype)gmswizzled_init {
  [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance];
  return [self gmswizzled_init];
}

- (void)gmswizzled_viewWillAppear:(BOOL)animated {
  [(AppDelegate*)UIApplication.sharedApplication.delegate uncustomiseAppearance];
  [self gmswizzled_viewWillAppear:animated];
}

- (void)gmswizzled_viewWillDisappear:(BOOL)animated {
  [(AppDelegate*)UIApplication.sharedApplication.delegate customiseAppearance];
  [self gmswizzled_viewWillDisappear:animated];
}

@end

init(なぜとの両方で外観のカスタマイズを解除したのか思い出せないことは認めざるを得ませんviewWillAppearが、理由があったことはかなり確信しています ...)。

于 2015-02-18T14:58:18.887 に答える
0

iOS 9 と 10 でさまざまな方法を試しましたが、うまくいったのはこれだけです。navigationBar の背後にも背景画像があることに注意してください。

[UIApplication.sharedApplication setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
NSDictionary *attribs = @{NSForegroundColorAttributeName:UIColor.whiteColor};
UINavigationBar.appearance.titleTextAttributes = attribs;
UINavigationBar.appearance.tintColor = UIColor.whiteColor;
[UINavigationBar.appearance setBackgroundImage:[UIImage imageNamed:@"IOSNavigationBar"] forBarMetrics:UIBarMetricsDefault];
UIBarButtonItem.appearance.tintColor = UIColor.whiteColor;
于 2016-09-09T04:15:52.817 に答える
0

iOS7の場合、このコードを実行する必要があると思います

[[UINavigationBar appearance] setTintColor:[UIColor redColor]];

それも機能しない場合は、インターネットで入手可能な Mail Compose View Controller のアップル ドキュメントを試してください。

于 2013-12-27T18:53:03.713 に答える