web-dev-qa-db-ja.com

メールの送信ボタンとキャンセルボタンのテキストの色を設定できませんcomposer iOS7のUIActivityViewControllerから表示される場合

UIActivityViewControllerを使用して、iOS7でアイテムを共有しています。 [メール]オプションをタップすると、メールコンポーザーがポップアップしますが、ナビゲーションバーの[キャンセル]および[送信]ボタンとナビゲーションバー自体が青色であるため、読みにくくなっているため、色を変更します。 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]];

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

67
Jonathan Shih

SendおよびCancelボタンのテキストの色を変更しました。 UINavigationBarMFMailComposerViewControllerにあります(SendおよびCancel))およびMFMessageComposeViewControllerCancel)のみ、UIActivityViewControllerから表示される場合。

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

Using an UIActivityViewController

SendおよびCancelのデフォルトのテキスト色に気付くでしょうボタンは青です:

Default blue colors

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

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

この結果:

Changed to white

たとえば、他の色を使用することもできます。

[UIColor purpleColor];

Change to purple

[UIColor greenColor];

Changed to green

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

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

でテストすると動作しませんでした

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

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

76
Alex

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
    }
}
25
mazorati

これが、今日の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();
        }
    }];
}

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

6
Maciej Swic

Swift:の場合

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

これにより、SendCancelボタンの色が白に変更されます(iOSでテスト済み) 7,8)しかし、ステータスバーのテキストの色を白にすることはまだできません。(サブクラスUIActivityViewControllerのステータスバーのテキストの色を変更する解決策は試していませんが)

4
Aks

外観プロキシのおかげで、アプリでtintColorUINavigationBarプロパティがどこでも白いという同じ問題が発生しました。結果として、メールからのUIBarButtonItem composer View Controller navigationBarは表示されませんでした(白いナビゲーションバー上の白いボタン)。

この呼び出しはapplication:didFinishLaunchingWithOptions: 方法:

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

メールのUINavigationBarにアクセスすることは(現時点では?)不可能なので、UIActivityViewController内のView Controller composer View Controller)に触発された次の回避策を行いましたアレックスの答えから:

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(ケビン・ファン・ミールロの回答を参照)

3
paillou

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

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

このようにUIActivityViewControllerをサブクラス化することで問題を修正しました。viewWillAppear viewWilldisapper

extension UIActivityViewController {
        override open func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            UINavigationBar.appearance().barTintColor = .white
        }

        open override func viewDidLoad() {
            super.viewDidLoad()
            navigationController?.navigationBar.isTranslucent = false
            navigationController?.navigationBar.isOpaque = false
            navigationController?.navigationBar.barTintColor = UIColor(red: (247/255), green: (247/255), blue: (247/255), alpha: 1)
            //navigationBar.tintColor = UIColor.white
        }
        open override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(true)
            UINavigationBar.appearance().barTintColor = mycustomColor
        }
    }
2
user3700746

これは私のために働いています: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では問題なく動作しますが、新しいバージョンでは試されませんでした

1
Eliktz

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]];
1

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

MFMailComposeViewController Apple documentation: MFMailComposeViewController へのリンクです。

お役に立てれば!

1
user2277872

このコードを試してみてください。

[[mailComposer navigationBar] setTintColor:[UIColor blackColor]];
1
Pradhyuman sinh

アレックスのソリューションを機能させることはできませんでしたが、私の状況では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]];

ありがとう、ペイルルー!

1
staticnz

appearanceを提示する前にUIActivityViewControllerを設定できます。 activity VCcompletionWithItemsHandlerに外観のリセットを追加します。

setNavBarAppearance()

activityVC.completionWithItemsHandler = { [weak self] _, _, _, _ in
    self?.resetNavBarAppearance()
}

present(activityVC, animated: true, completion: nil)

唯一の問題は、アクティビティがメール送信のようなものである場合、フルスクリーンであることです。外観は、現在の表示ビューには適用されません。それを解決するための小さなハック:

setNavBarAppearance()

activityVC.completionWithItemsHandler = { [weak self] _, _, _, _ in
    self?.resetNavBarAppearance()

    // Hacks(choose one of them):
    // 1)
    self?.navigationController?.isNavigationBarHidden = true
    self?.navigationController?.isNavigationBarHidden = false
    // 2)
    let redrawTriggerVC = UIViewController()
    redrawTriggerVC.modalPresentationStyle = .popover
    self.present(redrawTriggerVC, animated: false, completion: nil)
    redrawTriggerVC.dismiss(animated: false, completion: nil)
}

present(activityVC, animated: true, completion: nil)
1
Vlad Pulichev

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;
0
EricS

私が気に入ったメカニズムを見つけていないので、ここで価値があるのは私のものです。問題の一部は、iOSの新しいバージョンがアプリにシステム全体の共有およびアクション拡張機能を追加する機能を追加することです。これらのサードパーティのアイテムは、あらゆる種類の方法でコーディングされているようです。一部はアプリのナビゲーションバースタイルを継承し、一部は独自のナビゲーションバースタイルを継承し、一部は白いナビゲーションバーを想定しているように見えます(ただし、実際にはアプリから継承します)。

これはiOS 12.2でテストされています。

私が持っているUIActivityItemSourceを作成します:

- (nullable id)activityViewController:(nonnull UIActivityViewController *)activityViewController itemForActivityType:(nullable UIActivityType)activityType {
    if (activityType == UIActivityTypePrint || [activityType.lowercaseString containsString:@"extension"] || [activityType containsString:@"AssignToContact"]) {
        //What a hack, but the best I can do.  Seems some extensions inherit nav style from parent, others don't.
        //ActionExtension is bottom row; all those I tested need this.  The string comparison catches most non-OS extensions (the type is set by developer).
        [[UINavigationBar appearance] setBarTintColor:[UIColor kNavigationBarBackgroundColor]]; //kNavigationBarBackgroundColor is my app's custom nav bar background color
    } else {
        [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
    }
    return self.pdfData; //In my case I'm sharing a PDF as NSData - modify as needed for your shared item
}

次に、私のUIActivityViewControllercompletionWithItemsHandlerに以下を含めます。

[[UINavigationBar appearance] setBarTintColor:[UIColor kNavigationBarBackgroundColor]]; //Again, this is my app's custom nav bar background color

特定の問題とは無関係ですが、現在UIActivityItemSourceがない場合は、次のようなことをする必要があります。

NSArray *activities=@[self]; //And set self to be a UIActivityItemSource
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:activities applicationActivities:nil];

これは100%信頼できるものではないと確信していますが、試したすべての拡張機能で動作しました。

0
Mitch Cohen

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

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

動作しない場合は、Mail Compose View Controller Appleインターネットで入手可能なドキュメントを試してください。

0
santosh

In 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)
0
Glauco Neves

特にMFMailComposeViewController/MFMessageViewController自体がUIActivityViewControllerで表示されている場合、私はこれに大きな問題を抱えていました。

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

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

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

0
jawj

SwiftiOS9で設定

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

activity View Controllerを提示する前に、私にトリックをしました。

0
Phlippie Bosman

メールを提示する前にcomposerこの行を次のように挿入します。

[mailComposer.navigationBar setTintColor:[UIColor whiteColor]];
[self presentViewController:mailComposer animated:YES completion:nil];

アプリケーションでステータスバーのスタイルを設定しても起動が完了しましたが、次のように完了ブロックで再度設定する必要がありました。

[self presentViewController:mailComposer animated:YES completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}];
0
T.J.