web-dev-qa-db-ja.com

iOS 8 UIActivityViewControllerおよびUIAlertControllerボタンのテキストの色はウィンドウのtintColorを使用します

IOS 8では、UIAlertController(具体的にはアクションシートタイプ)のボタンとUIActivityViewControllerのボタンは、メインウィンドウのtintColorから色を取得するようです。

ボタンのテキストの色を変更するにはどうすればよいですか?私はこのような外観プロキシを使用してみました:

[[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

しかし、効果はありません。私のウィンドウのtintColorは白なので、UIActivityViewControllerボタンのテキストも白であり、見ることができません。ウィンドウのtintColorを変更するとこの問題は解決しますが、アプリの残りの部分が台無しになります。

UIActivityViewControllerのスクリーンショットをご覧ください。下部に白いテキストが付いた白いキャンセルボタンがあります。

UIActivityViewController with white Cancel button text

同じことがUIActionSheet(はい、廃止されていることは知っています)とactionSheetタイプのUIAlertControllerにも当てはまります。

アプリ全体のtintColorを変更せずに、これらのウィンドウのテキストを読みやすくするにはどうすればよいですか?前もって感謝します!

31
DiscDev

アプリケーションに定義されているグローバルな色合いに加えて、各View Controllerでは、そのコントローラーだけの色合いをオーバーライドできます。この場合、最善の策は、初期化後、表示する前にUIActivityViewControllerにtintColorを設定することです。

UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];

//Set the tint color on just the activity controller as needed here before presenting
[activityController.view setTintColor:[UIColor blueColor]];

[self presentViewController:activityController animated:YES completion:nil];

アプリでこれを頻繁に行う場合は、サブクラスまたはカテゴリを使用して、コードの重複を避けることができます。

30
jlichti

これはUIAlertControllerでうまくいきました。

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]];
21
AndreasZ

iOS 11

        let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        activityVC.popoverPresentationController?.sourceView = self.view

        //Set your activity view controller's appearance
        UIButton.appearance().tintColor = .blue

        //Set back to default UIButton appearance
        self.present(activityVC, animated: true, completion: {
            DispatchQueue.main.async {
                UIButton.appearance().tintColor = nil
            }
        })
3
belebeich

IOS 9では、UIActivityViewControllerを表示するビューに色を付けることでこれを修正できました。残念ながら、iOS 10/Xcode 8ではこれが機能しなくなりました。 [キャンセル]ボタンに白く見えないテキストが表示されないように、共有パネルに色を付けようとしました。

IOS 10で動作することがわかったのは、UIButton.appearance().tintColor = UIColor.redだけです。これをアプリデリゲートでグローバルに設定できます(ただし、これはナビゲーションバーボタンなどにも色を付けるため、手動で別の色に色付けする必要があります)。これをビューでローカルに設定することもできますが、これは実際にはすべてのボタンタイプに適用されるグローバルテーマであるため、次のビューで選択したくない場合は、別の色に戻す必要があります。

したがって、UIActivityViewControllerを初期化した後、それを提示する前に、上記の行に色合いの色を追加することで、ActivityControllerボタンだけの色合いとして'hackish'の方法で機能させることができました。そして、ActivityControllerプレゼンテーション関数の完了ハンドラーで、好みの色(白)に色合いを戻します。

ex://共有する画像let image = UIImage(named: "Image")

    // set up activity view controller
    let imageToShare = [ image! ]
    let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    UIButton.appearance().tintColor = UIColor.red

    // present the view controller
    self.present(activityViewController, animated: true, completion: {
        DispatchQueue.main.async {
            UIButton.appearance().tintColor = UIColor.white
        }
    })
2
Natalia

私のために働いた-最初に現在の色合いをバックアップする

//COLCSocialManager.showShareActivityViewController(fromVC: aViewController)
    class func showShareActivityViewController(fromVC vc: UIViewController){


        let textToShare = "TAXI. New iOS app for tourists and cabbies. Check it out its free."
        let linkToShare = "http://buff.ly/dddd"

        //on FB the link is converted
        let activityItems: [Any] = [ textToShare, linkToShare ]

        let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = vc.view // so that iPads won't crash

        // exclude some activity types from the list (optional)
        //activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ]

        let buttonTintBackup = UIButton.appearance().tintColor

        UIButton.appearance().tintColor = UIColor.red

        // present the view controller
        vc.present(activityViewController, animated: true) {
            UIButton.appearance().tintColor = buttonTintBackup
        }

    }
1
brian.clear

UIActivityControllerの完了ハンドラーを使用したエレガントなソリューション。

    let barTintColor = UINavigationBar.appearance().barTintColor
    let bTintColour = UINavigationBar.appearance().tintColor

    UINavigationBar.appearance().barTintColor = UIColor.white
    UINavigationBar.appearance().tintColor = UIColor.darkGray

    activityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
        UINavigationBar.appearance().barTintColor = barTintColor
        UINavigationBar.appearance().tintColor =  bTintColour
    }
0
Prakash