UIAlertControllerカスタムフォント、サイズ、色


118

アラートの表示に新しいUIAlertControllerを使用しています。私はこのコードを持っています:

// nil titles break alert interface on iOS 8.0, so we'll be using empty strings
UIAlertController *alert = [UIAlertController alertControllerWithTitle: title == nil ? @"": title message: message preferredStyle: UIAlertControllerStyleAlert];


UIAlertAction *defaultAction = [UIAlertAction actionWithTitle: cancelButtonTitle style: UIAlertActionStyleCancel handler: nil];

[alert addAction: defaultAction];

UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[rootViewController presentViewController:alert animated:YES completion:nil];

タイトルとメッセージのフォント、色、サイズなどを変更したいと思います。これを行う最良の方法は何ですか?

編集: コード全体を挿入する必要があります。UIViewのカテゴリを作成しました。iOSバージョンに適切なアラートを表示できます。

@implementation UIView (AlertCompatibility)

+( void )showSimpleAlertWithTitle:( NSString * )title
                          message:( NSString * )message
                cancelButtonTitle:( NSString * )cancelButtonTitle
{
    float iOSVersion = [[UIDevice currentDevice].systemVersion floatValue];
    if (iOSVersion < 8.0f)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle: title
                                                        message: message
                                                       delegate: nil
                                              cancelButtonTitle: cancelButtonTitle
                                              otherButtonTitles: nil];
        [alert show];
    }
    else
    {
        // nil titles break alert interface on iOS 8.0, so we'll be using empty strings
        UIAlertController *alert = [UIAlertController alertControllerWithTitle: title == nil ? @"": title
                                                                       message: message
                                                                preferredStyle: UIAlertControllerStyleAlert];


        UIAlertAction *defaultAction = [UIAlertAction actionWithTitle: cancelButtonTitle
                                                                style: UIAlertActionStyleCancel
                                                              handler: nil];

        [alert addAction: defaultAction];

        UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        [rootViewController presentViewController:alert animated:YES completion:nil];
    }
}

2
DISCLAIMER:以下を読んでいる人への答え。Appleはアプリを拒否します。プライベートAPIを使用する傾向がある場合。そして、何が起こっているの答え以下..で
ヤシュBedi

回答:


98

これがプライベートAPI /プロパティに反するかどうかはわかりませんが、iOS 8ではKVCを使用するとうまくいきます

UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Dont care what goes here, since we're about to change below" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Presenting the great... Hulk Hogan!"];
[hogan addAttribute:NSFontAttributeName
              value:[UIFont systemFontOfSize:50.0]
              range:NSMakeRange(24, 11)];
[alertVC setValue:hogan forKey:@"attributedTitle"];



UIAlertAction *button = [UIAlertAction actionWithTitle:@"Label text" 
                                        style:UIAlertActionStyleDefault
                                        handler:^(UIAlertAction *action){
                                                    //add code to make something happen once tapped
}];
UIImage *accessoryImage = [UIImage imageNamed:@"someImage"];
[button setValue:accessoryImage forKey:@"image"];

記録としては、これらのプライベートAPIを使用して、アラートアクションのフォントを変更することもできます。繰り返しますが、アプリが拒否される可能性があります。そのようなコードはまだ送信していません。

let alert = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)

let action = UIAlertAction(title: "Some title", style: .Default, handler: nil)
let attributedText = NSMutableAttributedString(string: "Some title")

let range = NSRange(location: 0, length: attributedText.length)
attributedText.addAttribute(NSKernAttributeName, value: 1.5, range: range)
attributedText.addAttribute(NSFontAttributeName, value: UIFont(name: "ProximaNova-Semibold", size: 20.0)!, range: range)

alert.addAction(action)

presentViewController(alert, animated: true, completion: nil)

// this has to be set after presenting the alert, otherwise the internal property __representer is nil
guard let label = action.valueForKey("__representer")?.valueForKey("label") as? UILabel else { return }
label.attributedText = attributedText

XCode 10以降のSwift 4.2の場合、最後の2行は次のとおりです。

guard let label = (action!.value(forKey: "__representer")as? NSObject)?.value(forKey: "label") as? UILabel else { return }
        label.attributedText = attributedText

6
それは働いています。attributedTitleタイトルとattributedMessageメッセージ。それが最善の解決策かどうかはわかりませんが、今のところ私には十分です。
Libor Zapletal 2014年

2
UIAlertControllerボタンに追加できるすべてのカスタマイズ?
Aanchal Chaurasia 2015

1
ありがとう!小さな質問がありますUIAlertController。属性タイルとメッセージでカスタムフォントと色を使用できます。どうすれば同じことができUIAlertActionますか?
p0lAris 2015年

72
プライベートAPIを使用しているため、これをアプリストアにリリースする予定がないことを願っています。真剣に、これらの回答が本当に「回答」ではないのに、なぜこれらの回答がStackoverflowで受け入れられるのかわかりません。これらは、アプリケーションストアでの公開を回避できる、またはできないハックです。
TheCodingArt 2016年

3
アプリストアでアプリをリリースする場合、プライベートAPIの一部はAppleで許可されていますが、ユーザーのシステムやプライバシーに害を及ぼす、または影響を与える可能性があるAPIを使用しないでください。だから、おそらくこの答えだけで多くの人がこの答えを受け入れるかもしれません。そしておそらくそれはアプリストアに影響を与えていないかもしれません。これを使用したことがある人は、自分のアプリが拒否されていないことを確認できますか?
Mehul Thakkar 2017年

66

UIAlertControllerにティントカラーを適用することにより、ボタンの色を変更できます。

iOS 9では、ウィンドウのティントカラーがカスタムカラーに設定されている場合、アラートを表示した直後にティントカラーを適用する必要があります。そうでない場合、ティントカラーはカスタムウィンドウのティントカラーにリセットされます。

// In your AppDelegate for example:
window?.tintColor = UIColor.redColor()

// Elsewhere in the App:
let alertVC = UIAlertController(title: "Title", message: "message", preferredStyle: .Alert)
alertVC.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
alertVC.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))

// Works on iOS 8, but not on iOS 9
// On iOS 9 the button color will be red
alertVC.view.tintColor = UIColor.greenColor()

self.presentViewController(alert, animated: true, completion: nil)

// Necessary to apply tint on iOS 9
alertVC.view.tintColor = UIColor.greenColor()

20
明確にするために、コントローラーを提示した後でtintColorを設定すると、iOS 8と9の両方で機能するため、2回設定する必要はありません。
arlomedia 2015

iOS 9でこの問題のSwift回答と回避策を追加していただきありがとうございます
peacetype

3
タップして指を下にドラッグすると、デフォルトの色に戻ります。何か案が?
msmq

これが本当にここでの唯一のまともな答えです。
TheCodingArt 2016年

47

次のコードを使用して、ボタンのテキストの色を変更できます。

alertC.view.tintColor = your color;

多分これはあなたを助けるでしょう。


@esilver iOS9で動作するソリューションを見つけましたか?
アッシュ

1
私はしませんでした。アップルでバグレポートを作成しました#22391695。
esilver 2015

1
これに関する詳細情報。長いリストアイテムをスクロールすると、スクロールするためにタッチしたアイテムが青色になるようです...
Bejil

3
これはiOS9と9.1のUIAlertControllerでは機能しません。Appleの最新情報がわかりません...アラートコントローラーが呼び出されるたびにウィンドウティントを手動で変更し、ハンドラーで変更する必要があります。
Akhilesh Sharma

システムの青に戻ってくる:あなたはoutisideタッチアップしない限り、それは、iOSの9.3で動作します
レミBelzanti

35

Xcode 8 Swift 3.0の場合

@IBAction func touchUpInside(_ sender: UIButton) {

    let alertController = UIAlertController(title: "", message: "", preferredStyle: .alert)

    //to change font of title and message.
    let titleFont = [NSFontAttributeName: UIFont(name: "ArialHebrew-Bold", size: 18.0)!]
    let messageFont = [NSFontAttributeName: UIFont(name: "Avenir-Roman", size: 12.0)!]

    let titleAttrString = NSMutableAttributedString(string: "Title Here", attributes: titleFont)
    let messageAttrString = NSMutableAttributedString(string: "Message Here", attributes: messageFont)

    alertController.setValue(titleAttrString, forKey: "attributedTitle")
    alertController.setValue(messageAttrString, forKey: "attributedMessage")

    let action1 = UIAlertAction(title: "Action 1", style: .default) { (action) in
        print("\(action.title)")
    }

    let action2 = UIAlertAction(title: "Action 2", style: .default) { (action) in
        print("\(action.title)")
    }

    let action3 = UIAlertAction(title: "Action 3", style: .default) { (action) in
        print("\(action.title)")
    }

    let okAction = UIAlertAction(title: "Ok", style: .default) { (action) in
        print("\(action.title)")
    }

    alertController.addAction(action1)
    alertController.addAction(action2)
    alertController.addAction(action3)
    alertController.addAction(okAction)

    alertController.view.tintColor = UIColor.blue
    alertController.view.backgroundColor = UIColor.black
    alertController.view.layer.cornerRadius = 40

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

}

出力

UIAlertControllerカスタムフォント、サイズ、色


申し訳ありません、これはスタートアップです。機能で必要な場合は、お知らせします...
iOS

24

@ dupuis2387回答のSwift翻訳。キーUIAlertControllerを使用してKVC経由でタイトルの色とフォントを設定する構文を作成しましたattributedTitle

let message = "Some message goes here."
let alertController = UIAlertController(
    title: "", // This gets overridden below.
    message: message,
    preferredStyle: .Alert
)
let okAction = UIAlertAction(title: "OK", style: .Cancel) { _ -> Void in
}
alertController.addAction(okAction)

let fontAwesomeHeart = "\u{f004}"
let fontAwesomeFont = UIFont(name: "FontAwesome", size: 17)!
let customTitle:NSString = "I \(fontAwesomeHeart) Swift" // Use NSString, which lets you call rangeOfString()
let systemBoldAttributes:[String : AnyObject] = [ 
    // setting the attributed title wipes out the default bold font,
    // so we need to reconstruct it.
    NSFontAttributeName : UIFont.boldSystemFontOfSize(17)
]
let attributedString = NSMutableAttributedString(string: customTitle as String, attributes:systemBoldAttributes)
let fontAwesomeAttributes = [
    NSFontAttributeName: fontAwesomeFont,
    NSForegroundColorAttributeName : UIColor.redColor()
]
let matchRange = customTitle.rangeOfString(fontAwesomeHeart)
attributedString.addAttributes(fontAwesomeAttributes, range: matchRange)
alertController.setValue(attributedString, forKey: "attributedTitle")

self.presentViewController(alertController, animated: true, completion: nil)

ここに画像の説明を入力してください


3
「OK」ボタンはどうですか?カスタマイズできますか?
Hassan Taleb

@HassanTalebボタンをカスタマイズする優れた方法が見つかりませんでした。tintColoron viewまたはviaを設定できますappearanceWhenContainedInが、タッチすると色合いが消えます。まだ答えを探しています。
Robert Chen

@AbdulMomenعبدالمؤمنどのエラーメッセージが表示されていますか?コードスニペットは、FontAwesomeがすでに設定されていることを前提としています。
Robert Chen

1
@RobertChenは問題を解決するために、単に色合いを後に置きます:self.presentViewController(alertController, animated: true, completion: nil)ボタン「OK」のフォントを変更できますか?
Hassan Taleb

4
これはプライベートAPIではありませんか?
Jinghan Wang 2016

13

UIAppearanceプロトコルを使用します。フォントの設定例-拡張するカテゴリを作成します UILabel

@interface UILabel (FontAppearance)
@property (nonatomic, copy) UIFont * appearanceFont UI_APPEARANCE_SELECTOR;
@end


@implementation UILabel (FontAppearance)

-(void)setAppearanceFont:(UIFont *)font {
    if (font)
        [self setFont:font];
}

-(UIFont *)appearanceFont {
    return self.font;
}

@end

そしてその使用法:

UILabel * appearanceLabel = [UILabel appearanceWhenContainedIn:UIAlertController.class, nil];
[appearanceLabel setAppearanceFont:[UIFont boldSystemFontOfSize:10]]; //for example

テスト済みで、スタイルUIAlertControllerStyleActionSheetで動作しますが、それでも動作すると思いUIAlertControllerStyleAlertます。

PS iOSバージョンの代わりにクラスの利用可能性をよりよくチェックする:

if ([UIAlertController class]) {
    // UIAlertController code (iOS 8)
} else {
    // UIAlertView code (pre iOS 8)
}

それは機能していますが、この方法でメッセージとタイトルのサイズを変えることはできません。
Libor Zapletal 2014年

これは機能しますが、アクションをクリックすると、フォントは元のサイズに戻りますか?これはあなたのために起こりますか?
Larry

私は同じ問題を@Larryに持っていますが、それに対処する方法が見つかりませんでした。
アラスカ

12

UIAppearanceプロトコルを使用します。のappearanceFontフォントを変更するために、さらにハックを行いUIAlertActionます。

カテゴリを作成 UILabel

UILabel + FontAppearance.h

@interface UILabel (FontAppearance)

@property (nonatomic, copy) UIFont * appearanceFont UI_APPEARANCE_SELECTOR;

@end

UILabel + FontAppearance.m

@implementation UILabel (FontAppearance)

- (void)setAppearanceFont:(UIFont *)font
{
    if (self.tag == 1001) {
        return;
    }

    BOOL isBold = (self.font.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold);
    const CGFloat* colors = CGColorGetComponents(self.textColor.CGColor);

    if (self.font.pointSize == 14) {
        // set font for UIAlertController title
        self.font = [UIFont systemFontOfSize:11];
    } else if (self.font.pointSize == 13) {
        // set font for UIAlertController message
        self.font = [UIFont systemFontOfSize:11];
    } else if (isBold) {
        // set font for UIAlertAction with UIAlertActionStyleCancel
        self.font = [UIFont systemFontOfSize:12];
    } else if ((*colors) == 1) {
        // set font for UIAlertAction with UIAlertActionStyleDestructive
        self.font = [UIFont systemFontOfSize:13];
    } else {
        // set font for UIAlertAction with UIAlertActionStyleDefault
        self.font = [UIFont systemFontOfSize:14];
    }
    self.tag = 1001;
}

- (UIFont *)appearanceFont
{
    return self.font;
}

@end

使用法:

追加

[[UILabel appearanceWhenContainedIn:UIAlertController.class, nil] setAppearanceFont:nil];

AppDelegate.m、それはすべてのために動作させるためにUIAlertController


iOS 8.3のタイトルは13ポイントで太字なので、条件をif (self.font.pointSize == 13 && isBold) {
Andrew Raphael

のフォントの変更について説明しましたUIAlertAction。しかし、私が知る限り、UIAlertActionは使用しませんUILabel。それは使用しNSStringます。github.com/nst/iOS-Runtime-Headers/blob/…のフォントをカスタマイズする方法がわかりませんNSString
平和タイプ2015年

UIAlertActionはビュークラスではありません。これは、アクションを記述する抽象クラスです。次に、ビュー自体がUIAlertController内に生成されます。したがって、UIAlertControllerに含まれる外観を設定します。
mangerlahn 2018

12

Swift 5および5.1。別のファイルを作成し、UIAlertControllerカスタマイズコードをそこに配置します

import Foundation
import  UIKit

extension UIAlertController {

  //Set background color of UIAlertController
  func setBackgroudColor(color: UIColor) {
    if let bgView = self.view.subviews.first,
      let groupView = bgView.subviews.first,
      let contentView = groupView.subviews.first {
      contentView.backgroundColor = color
    }
  }

  //Set title font and title color
  func setTitle(font: UIFont?, color: UIColor?) {
    guard let title = self.title else { return }
    let attributeString = NSMutableAttributedString(string: title)//1
    if let titleFont = font {
      attributeString.addAttributes([NSAttributedString.Key.font : titleFont],//2
        range: NSMakeRange(0, title.utf8.count))
    }
    if let titleColor = color {
      attributeString.addAttributes([NSAttributedString.Key.foregroundColor : titleColor],//3
        range: NSMakeRange(0, title.utf8.count))
    }
    self.setValue(attributeString, forKey: "attributedTitle")//4
  }

  //Set message font and message color
  func setMessage(font: UIFont?, color: UIColor?) {
    guard let title = self.message else {
      return
    }
    let attributedString = NSMutableAttributedString(string: title)
    if let titleFont = font {
      attributedString.addAttributes([NSAttributedString.Key.font : titleFont], range: NSMakeRange(0, title.utf8.count))
    }
    if let titleColor = color {
      attributedString.addAttributes([NSAttributedString.Key.foregroundColor : titleColor], range: NSMakeRange(0, title.utf8.count))
    }
    self.setValue(attributedString, forKey: "attributedMessage")//4
  }

  //Set tint color of UIAlertController
  func setTint(color: UIColor) {
    self.view.tintColor = color
  }
}

今すぐ任意のアクションでアラートを表示

  func tapShowAlert(sender: UIButton) {
    let alertController = UIAlertController(title: "Alert!!", message: "This is custom alert message", preferredStyle: .alert)
    // Change font and color of title
    alertController.setTitle(font: UIFont.boldSystemFont(ofSize: 26), color: UIColor.yellow)
    // Change font and color of message
    alertController.setMessage(font: UIFont(name: "AvenirNextCondensed-HeavyItalic", size: 18), color: UIColor.red)
    // Change background color of UIAlertController
    alertController.setBackgroudColor(color: UIColor.black)
    let actnOk = UIAlertAction(title: "Ok", style: .default, handler: nil)
    let actnCancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(actnOk)
    alertController.addAction(actnCancel)
    self.present(alertController, animated: true, completion: nil)
  }

結果

ここに画像の説明を入力してください


1
ここでプライベートAPIにアクセスしていますか?これらの多くのカスタムアラートプロパティを備えたアプリをリリースしましたか?
Yash Bedi

@YashBediはプライベートAPIを使用しており、Appleは「非パブリックAPI」の使用のためにアプリを拒否する場合があります。いいえ、アプリをリリースしていません。
Gurjinder Singh

これはApple開発者サイトで言及されています->重要UIAlertControllerクラスはそのまま使用することを意図しており、サブクラス化をサポートしていません。このクラスのビュー階層はプライベートであり、変更してはなりません。
Gurjinder Singh

わかったボスありがとう
Yash Bedi

@Darkglowエラーに言及してください。
Swift

10

使っています。

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];

1行(AppDelegate)を追加し、すべてのUIAlertControllerに対して機能します。


3
これは現在非推奨なので、[[UIView appearWhenContainedInInstancesOfClasses:@ [[UIAlertController class]]] setTintColor:newColor]を使用します。代わりに
ピータージョンソン

8

スウィフト4

タイトルのカスタムフォントの例。メッセージやアクションなど、他のコンポーネントについても同様です。

    let titleAttributed = NSMutableAttributedString(
            string: Constant.Strings.cancelAbsence, 
            attributes: [NSAttributedStringKey.font:UIFont(name:"FONT_NAME",size: FONT_SIZE)]
    )

    let alertController = UIAlertController(
        title: "",
        message: "",
        preferredStyle: UIAlertControllerStyle.YOUR_STYLE
    )

    alertController.setValue(titleAttributed, forKey : "attributedTitle")
    present(alertController, animated: true, completion: nil)

5

Swift 4.1およびXcode 9.4.1の拡張機能を次に示します。

extension UIAlertController{

func addColorInTitleAndMessage(color:UIColor,titleFontSize:CGFloat = 18, messageFontSize:CGFloat = 13){

    let attributesTitle = [NSAttributedStringKey.foregroundColor: color, NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: titleFontSize)]
    let attributesMessage = [NSAttributedStringKey.foregroundColor: color, NSAttributedStringKey.font: UIFont.systemFont(ofSize: messageFontSize)]
    let attributedTitleText = NSAttributedString(string: self.title ?? "", attributes: attributesTitle)
    let attributedMessageText = NSAttributedString(string: self.message ?? "", attributes: attributesMessage)

    self.setValue(attributedTitleText, forKey: "attributedTitle")
    self.setValue(attributedMessageText, forKey: "attributedMessage")

}}

4

の交換を完了しましたUIAlertControllerこれが唯一の賢明な方法です。


古い

これがSwiftの私の方法であり、ここで答えから多くの情報をマッシュアップします

func changeAlert(alert: UIAlertController, backgroundColor: UIColor, textColor: UIColor, buttonColor: UIColor?) {
    let view = alert.view.firstSubview().firstSubview()
    view.backgroundColor = backgroundColor
    view.layer.cornerRadius = 10.0

    // set color to UILabel font
    setSubviewLabelsToTextColor(textColor, view: view)

    // set font to alert via KVC, otherwise it'll get overwritten
    let titleAttributed = NSMutableAttributedString(
        string: alert.title!,
        attributes: [NSFontAttributeName:UIFont.boldSystemFontOfSize(17)])
    alert.setValue(titleAttributed, forKey: "attributedTitle")


    let messageAttributed = NSMutableAttributedString(
        string: alert.message!,
        attributes: [NSFontAttributeName:UIFont.systemFontOfSize(13)])
    alert.setValue(messageAttributed, forKey: "attributedMessage")


    // set the buttons to non-blue, if we have buttons
    if let buttonColor = buttonColor {
        alert.view.tintColor = buttonColor
    }
}

func setSubviewLabelsToTextColor(textColor: UIColor, view:UIView) {
    for subview in view.subviews {
        if let label = subview as? UILabel {
            label.textColor = textColor
        } else {
            setSubviewLabelsToTextColor(textColor, view: subview)
        }
    }
}

これは完全に機能する場合もあれば、完全に失敗する場合もあります(色合いの色が期待どおりに表示されません)。


4

回避策を使用せずにPMAlertControllerなどの外部ライブラリを使用できます。この場合、AppleのカスタマイズできないUIAlertControllerを、超カスタマイズ可能なアラートに置き換えることができます。

Xcode 8、Swift 3、Objective-Cに対応

PMAlertControllerの例


特徴:

  • [x]ヘッダービュー
  • [x]ヘッダー画像(オプション)
  • [x]タイトル
  • [x]説明メッセージ
  • [x]カスタマイズ:フォント、色、寸法など
  • [x] 1、2ボタン(水平方向)または3+ボタン(垂直方向)
  • [x]ボタンが押されたときの閉鎖
  • [x]テキストフィールドのサポート
  • [x] UIAlertControllerと同様の実装
  • [x]ココアポッド
  • [x]カルタゴ
  • [x] UIKit Dynamicsによるアニメーション
  • [x] Objective-Cの互換性
  • [x] Swift 2.3およびSwift 3のサポート

PMAlertControllerは、アクションボタンのテキストが長い場合、ワードラップを許可しますか?
zeeple 2017

@zeepleは、アクションボタンがUIButtonのサブクラスであると見なします。そのようなものが actionButton.titleLabel.lineBreakMode = NSLineBreakByWordWrappingうまくいきます。
Paolo Musolino 2017

3

プレゼンテーション後のビューのティントカラーの設定に問題があります。presentViewController:animated:completion:の完了ブロックでこれを行っても、ボタンタイトルの色にちらつき効果が発生します。これはずさんで、専門的ではなく、まったく受け入れられません。

提示される他の解決策は、静的であるビュー階層に依存します。これは、Appleが嫌うものです。これらのソリューションがiOSの将来のリリースで失敗することを期待してください。

この問題を解決してどこでもそれを行う確実な方法の1つは、UIAlertControllerにカテゴリを追加し、viewWillAppearをスウィズルすることです。

ヘッダー:

//
//  UIAlertController+iOS9TintFix.h
//
//  Created by Flor, Daniel J on 11/2/15.
//

#import <UIKit/UIKit.h>

@interface UIAlertController (iOS9TintFix)

+ (void)tintFix;

- (void)swizzledViewWillAppear:(BOOL)animated;

@end

実装:

//
//  UIAlertController+iOS9TintFix.m
//
//  Created by Flor, Daniel J on 11/2/15.
//

#import "UIAlertController+iOS9TintFix.h"
#import <objc/runtime.h>

@implementation UIAlertController (iOS9TintFix)

+ (void)tintFix {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method method  = class_getInstanceMethod(self, @selector(viewWillAppear:));
        Method swizzle = class_getInstanceMethod(self, @selector(swizzledViewWillAppear:));
        method_exchangeImplementations(method, swizzle);});
}

- (void)swizzledViewWillAppear:(BOOL)animated {
    [self swizzledViewWillAppear:animated];
    for (UIView *view in self.view.subviews) {
        if (view.tintColor == self.view.tintColor) {
            //only do those that match the main view, so we don't strip the red-tint from destructive buttons.
            self.view.tintColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];
            [view setNeedsDisplay];
        }
    }
}

@end

プロジェクトに.pch(プリコンパイル済みヘッダー)を追加し、カテゴリーを含めます。

#import "UIAlertController+iOS9TintFix.h"

プロジェクトにpchを適切に登録してください。これにより、UIAlertControllerを使用するすべてのクラスにカテゴリメソッドが含まれます。

次に、アプリデリゲートのdidFinishLaunchingWithOptionsメソッドで、カテゴリをインポートして呼び出します

[UIAlertController tintFix];

コードによって起動されたか、他の誰かによって起動されたかに関係なく、アプリ内のすべてのUIAlertControllerのインスタンスに自動的に伝播します。

このソリューションはiOS 8.XとiOS 9.Xの両方で機能し、プレゼンテーション後の色合い変更のちらつきがありません。また、UIAlertControllerのサブビューのビュー階層に関して完全に不可知です。

ハッキングハッピー!


このソリューションはほとんど機能します。ただし、デバイスの回転では、色合いはスウィズルする前の状態に戻ります。
Dhiraj Gupta

ディラージ、私はプロジェクトのセットアップでこれを再度明示的にテストして、調査結果を調査しましたが、同意しません。色合いは回転時の状態には戻りません。
ObiDan 2015年

xcode 6.4およびxcode 7.0で機能が確認されています。8.Xおよび9.0のすべてのバリエーションのシミュレータを実行します。リクエストがあれば、プロジェクトをgithubに公開します。
ObiDan 2015年

さて、あなたは先に進んでプロジェクトを立てることができましたが、これは私が私に起こっていることを見ていました。また、iPadでは機能しませんでした。ただし、メソッドのスウィズリングのアイデアに基づいて、viewDidLayoutSubviewsをスウィズリングすることで機能させることできました。
Dhiraj Gupta、2015

プロジェクトを作成した場合は、viewDidLayoutSubviewsスウィズルを使用してプルリクエストを送信できます。これは、アプリの最新ビルドで使用してApp Storeに送信したばかりで、外観を確認できます。
Dhiraj Gupta、2015

3

このカテゴリを見つけください。UIAlertActionとUIAlertControllerのFONTとColorを変更できます。

使用する:

UILabel * appearanceLabel = [UILabel appearanceWhenContainedIn:UIAlertController.class, nil];
[appearanceLabel setAppearanceFont:yourDesireFont]];  

5
。ここにコードを貼り付けたり、ログインする人を必要としないサービスを使用して、してください
Sulthan

3

Swift 4.1およびXcode 10

//Displaying alert with multiple actions and custom font ans size
let alert = UIAlertController(title: "", message: "", preferredStyle: .alert)

let titFont = [NSAttributedStringKey.font: UIFont(name: "ArialHebrew-Bold", size: 15.0)!]
let msgFont = [NSAttributedStringKey.font: UIFont(name: "Avenir-Roman", size: 13.0)!]

let titAttrString = NSMutableAttributedString(string: "Title Here", attributes: titFont)
let msgAttrString = NSMutableAttributedString(string: "Message Here", attributes: msgFont)

alert.setValue(titAttrString, forKey: "attributedTitle")
alert.setValue(msgAttrString, forKey: "attributedMessage")

let action1 = UIAlertAction(title: "Action 1", style: .default) { (action) in
    print("\(String(describing: action.title))")
}

let action2 = UIAlertAction(title: "Action 2", style: .default) { (action) in
    print("\(String(describing: action.title))")
}

let okAction = UIAlertAction(title: "Ok", style: .default) { (action) in
    print("\(String(describing: action.title))")
}
alert.addAction(action1)
alert.addAction(action2)
alert.addAction(okAction)

alert.view.tintColor = UIColor.blue
alert.view.layer.cornerRadius = 40
// //If required background colour 
// alert.view.backgroundColor = UIColor.white

DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})

あなたの答えは更新がself.present(alertController, animated: true)必要self.present(alert, animated: true)です、または。
Yash Bedi

@Yash Bediさん、私の回答を更新していただきありがとうございます。一度確認してください。
iOS

2

iOS9のソリューション/ハック

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Test Error" message:@"This is a test" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
        NSLog(@"Alert View Displayed");
 [[[[UIApplication sharedApplication] delegate] window] setTintColor:[UIColor whiteColor]];
    }];

    [alertController addAction:cancelAction];
    [[[[UIApplication sharedApplication] delegate] window] setTintColor:[UIColor blackColor]];
    [self presentViewController:alertController animated:YES completion:^{
        NSLog(@"View Controller Displayed");
    }];

私はこれを試しました。アラートコントローラーが表示されると、ウィンドウの色合い設定が元に戻ることに注意してください。アラートコントローラで色が元に戻っているのがわかります。何らかのアクションがタップされたら、元に戻す必要があると思います。
ヘルマン・

それを指摘してくれて@Germánに感謝します。コードを変更しました。現在、AlertActionでの復帰を処理しています。しかし、はい、dimissハンドラでも処理できることに同意します
Akhilesh Sharma

1

私はアーバンアウトフィッターズで働いています。URBNAlertすべてのアプリで使用したオープンソースのポッドがあります。はに基づいていますがUIAlertController、高度にカスタマイズ可能です。

ソースはこちら:https : //github.com/urbn/URBNAlert

またはURBNAlert、Podfileに配置してポッドでインストールするだけです

ここにいくつかのサンプルコードがあります:

URBNAlertViewController *uac = [[URBNAlertViewController alloc] initWithTitle:@"The Title of my message can be up to 2 lines long. It wraps and centers." message:@"And the message that is a bunch of text. And the message that is a bunch of text. And the message that is a bunch of text."];

// You can customize style elements per alert as well. These will override the global style just for this alert.
uac.alertStyler.blurTintColor = [[UIColor orangeColor] colorWithAlphaComponent:0.4];
uac.alertStyler.backgroundColor = [UIColor orangeColor];
uac.alertStyler.textFieldEdgeInsets = UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0);
uac.alertStyler.titleColor = [UIColor purpleColor];
uac.alertStyler.titleFont = [UIFont fontWithName:@"Chalkduster" size:30];
uac.alertStyler.messageColor = [UIColor blackColor];
uac.alertStyler.alertMinWidth = @150;
uac.alertStyler.alertMaxWidth = @200;
// many more styling options available 

[uac addAction:[URBNAlertAction actionWithTitle:@"Ok" actionType:URBNAlertActionTypeNormal actionCompleted:^(URBNAlertAction *action) {
      // Do something
}]];

[uac addAction:[URBNAlertAction actionWithTitle:@"Cancel" actionType:URBNAlertActionTypeCancel actionCompleted:^(URBNAlertAction *action) {
      // Do something
}]];

[uac show];

これはActionSheetスタイルをサポートしていますか?
Danpe、2016年

@Danpeはそうではありません、それは純粋にAlertsのためだけのものです。これは、以前にサポートを追加することについて話し合ったものです
RyanG

1

CANCELなどの1つのボタンの色を赤い色に変更するには、UIAlertActionStyle.destructiveと呼ばれるこのスタイルプロパティを使用できます。

let prompt = UIAlertController.init(title: "Reset Password", message: "Enter Your E-mail :", preferredStyle: .alert)
        let okAction = UIAlertAction.init(title: "Submit", style: .default) { (action) in
              //your code
}

let cancelAction = UIAlertAction.init(title: "Cancel", style: UIAlertActionStyle.destructive) { (action) in
                //your code
        }
        prompt.addTextField(configurationHandler: nil)
        prompt.addAction(okAction)
        prompt.addAction(cancelAction)
        present(prompt, animated: true, completion: nil);

1

iOS 9.0以降の場合、アプリのデリゲートでこのコードを使用します

[[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertController class]]] setTintColor:[UIColor redColor]];

1

Swift 5.0

let titleAttrString = NSMutableAttributedString(string: "This is a title", attributes: [NSAttributedString.Key.font: UIFont(name: "CustomFontName", size: 17) as Any])
let messageAttrString = NSMutableAttributedString(string: "This is a message", attributes: [NSAttributedString.Key.font: UIFont(name: "CustomFontName", size: 13) as Any])

alertController.setValue(titleAttrString, forKey: "attributedTitle")
alertController.setValue(messageAttrString, forKey: "attributedMessage")

0

少し不格好ですが、これは今のところ、背景とテキストの色を設定するのに役立ちます。ここで見つけ

UIView * firstView = alertController.view.subviews.firstObject;
    UIView * nextView = firstView.subviews.firstObject;
    nextView.backgroundColor = [UIColor blackColor];

これは私が少しについて混乱しています何であるそれは、背景色のための作業を行いますが、それは色合いの色を変更することはありません
Akhileshシャルマ

0

私は1つのメソッドObjective-Cを作成しました

-(void)customAlertTitle:(NSString*)title message:(NSString*)message{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 80)];

UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 270, 50)];
titleLabel.text = title;
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.numberOfLines = 2;
titleLabel.textColor = [UIColor redColor];
titleLabel.textAlignment = NSTextAlignmentCenter;

[subView addSubview:titleLabel];

UILabel *messageLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 30, 270, 50)];
messageLabel.text = message;
messageLabel.font = [UIFont systemFontOfSize:18];
messageLabel.numberOfLines = 2;
messageLabel.textColor = [UIColor redColor];
messageLabel.textAlignment = NSTextAlignmentCenter;

[subView addSubview:messageLabel];

[alertView setValue:subView forKey:@"accessoryView"];
[alertView show];
}

Xcode 8.3.1で完全に動作するコード。要件に応じてカスタマイズできます。


0

私はこの種の要求を使用しているように見えますが、詳細は少し異なるため、OCはアラートとシートのポップアップウィンドウのカプセル化を実現しています。

日常の開発で頻繁に遭遇する、「単純な」需要などの図をアラートに追加したり、ボタンの色を変更したりする必要があります。

Github:https : //github.com/ReverseScale/RSCustomAlertView

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.