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]];
これにより、アプリを初めて実行したときに、すぐに青色に戻る前に、色が赤く点滅します。
SendおよびCancelボタンのテキストの色を変更しました。 UINavigationBar
のMFMailComposerViewController
にあります(SendおよびCancel))およびMFMessageComposeViewController
(Cancel)のみ、UIActivityViewController
から表示される場合。
UIActivityViewControllerを使用して、Message
またはMail
をタップします。
SendおよびCancelのデフォルトのテキスト色に気付くでしょうボタンは青です:
それを変更するには、AppDelegate.m
クラスのdidFinishLaunchingWithOptions
メソッドに、次の行を挿入します。
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:[UIColor whiteColor]];
この結果:
たとえば、他の色を使用することもできます。
[UIColor purpleColor];
[UIColor greenColor];
これをどのようにテストしましたか?このソリューションは次のように機能することに気付きました:
:でテストすると動作しませんでした
したがって、実際のデバイスでの動作はiOSシミュレータでの動作よりも重要であると考えているため、使用しても安全です。 iOS 7.0シミュレーターで動作しない理由を誰かが知っているなら、知りたいと思います。 :)
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
}
}
これが、今日の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();
}
}];
}
これにより、ボタンが白になり、ステータスバーが白になります。
Swift:の場合
self.navigationController?.presentViewController(activityViewController, animated: true, completion: { () in
UIBarButtonItem.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barTintColor = UIColor.whiteColor() // optional to change bar backgroundColor
}
これにより、Send&Cancelボタンの色が白に変更されます(iOSでテスト済み) 7,8)しかし、ステータスバーのテキストの色を白にすることはまだできません。(サブクラスUIActivityViewController
のステータスバーのテキストの色を変更する解決策は試していませんが)
外観プロキシのおかげで、アプリでtintColor
のUINavigationBar
プロパティがどこでも白いという同じ問題が発生しました。結果として、メールからの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(ケビン・ファン・ミールロの回答を参照)
これは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
}
}
これは私のために働いています: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では問題なく動作しますが、新しいバージョンでは試されませんでした
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]];
AppleのコードのUIがそのままである方法を変更できない理由はあります。それは主にAppleのものだからです。 MFMailComposerViewControllerのUIがどのように見えるかを編集することはできません。方法があれば、それについての手がかりはありませんが、それを行う方法を見たことはありません。 MFMailComposeViewControllerは、iOS 3.0で作成された外観属性をサポートしておらず、外観はiOS 5.0までのものになりませんでした
MFMailComposeViewController Apple documentation: MFMailComposeViewController へのリンクです。
お役に立てれば!
このコードを試してみてください。
[[mailComposer navigationBar] setTintColor:[UIColor blackColor]];
アレックスのソリューションを機能させることはできませんでしたが、私の状況では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]];
ありがとう、ペイルルー!
appearance
を提示する前にUIActivityViewController
を設定できます。 activity VC
のcompletionWithItemsHandler
に外観のリセットを追加します。
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)
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;
私が気に入ったメカニズムを見つけていないので、ここで価値があるのは私のものです。問題の一部は、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
}
次に、私のUIActivityViewController
のcompletionWithItemsHandler
に以下を含めます。
[[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%信頼できるものではないと確信していますが、試したすべての拡張機能で動作しました。
IOS7の場合、このコードを実行する必要があると思います
[[UINavigationBar appearance] setTintColor:[UIColor redColor]];
動作しない場合は、Mail Compose View Controller Appleインターネットで入手可能なドキュメントを試してください。
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)
特にMFMailComposeViewController
/MFMessageViewController
自体がUIActivityViewController
で表示されている場合、私はこれに大きな問題を抱えていました。
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
の両方で外観をカスタマイズしなかった理由を思い出せないことを認めざるを得ませんが、理由があると確信しています...)。
SwiftでiOS9で設定
UINavigationBar.appearance().barTintColor = UIColor.greenColor() // eg
UINavigationBar.appearance().translucent = false
activity View Controllerを提示する前に、私にトリックをしました。
メールを提示する前にcomposerこの行を次のように挿入します。
[mailComposer.navigationBar setTintColor:[UIColor whiteColor]];
[self presentViewController:mailComposer animated:YES completion:nil];
アプリケーションでステータスバーのスタイルを設定しても起動が完了しましたが、次のように完了ブロックで再度設定する必要がありました。
[self presentViewController:mailComposer animated:YES completion:^{[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];}];