Font, ukuran, warna kustom UIAlertController

118

Saya menggunakan UIAlertController baru untuk menampilkan peringatan. Saya memiliki kode ini:

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

Sekarang saya ingin mengubah judul dan font pesan, warna, ukuran dan sebagainya. Apa cara terbaik untuk melakukan ini?

Edit: Saya harus memasukkan seluruh kode. Saya membuat kategori untuk UIView sehingga saya dapat menunjukkan peringatan yang tepat untuk versi 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];
    }
}
Libor Zapletal
sumber
2
DISCLAIMER:Untuk siapa saja yang membaca jawaban di bawah ini. Apple akan menolak aplikasi Anda. Jika Anda cenderung menggunakan Api pribadi. Dan di bawah jawaban ITU APA YANG TERJADI ..
Yash Bedi

Jawaban:

98

Tidak yakin apakah ini bertentangan dengan API / properti pribadi tetapi menggunakan KVC berfungsi untuk saya di ios8

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

Sebagai catatan, dimungkinkan juga untuk mengubah font tindakan peringatan, menggunakan API pribadi tersebut. Sekali lagi, ini mungkin membuat aplikasi Anda ditolak, saya belum mencoba mengirimkan kode tersebut.

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

Untuk Swift 4.2 di XCode 10 dan 2 baris terakhir sekarang:

guard let label = (action!.value(forKey: "__representer")as? NSObject)?.value(forKey: "label") as? UILabel else { return }
        label.attributedText = attributedText
dupuis2387
sumber
6
Bekerja. attributedTitleuntuk judul dan attributedMessagepesan. Tidak yakin apakah itu solusi terbaik tetapi untuk saat ini sudah cukup baik untuk saya.
Libor Zapletal
2
apa semua kustomisasi yang dapat kita tambahkan pada tombol UIAlertController ??
Aanchal Chaurasia
1
Terima kasih! Saya punya pertanyaan kecil - seseorang dapat menggunakan font dan warna kustom dengan ubin atribut dan pesan masuk UIAlertController. Bagaimana seseorang bisa melakukan hal yang sama UIAlertAction?
p0lAris
72
Saya harap tidak ada dari Anda yang berencana merilis ini ke toko aplikasi karena menggunakan API pribadi. Sungguh, saya tidak tahu mengapa jawaban ini pernah diterima di Stackoverflow padahal sebenarnya bukan 'jawaban'. Ini adalah peretasan yang mungkin atau mungkin tidak bisa Anda terbitkan di toko aplikasi.
TheCodingArt
3
Untuk kasus merilis aplikasi di app store, beberapa penggunaan api pribadi diizinkan oleh Apple, tetapi tidak boleh menggunakan api yang dapat merusak atau mempengaruhi sistem / privasi pengguna. Jadi, mungkin jawaban ini bisa diterima oleh banyak orang karena ini saja. Dan mungkin itu mungkin tidak memengaruhi toko aplikasi. Dapatkah seseorang yang telah menggunakan ini, dapatkah mereka mengonfirmasi bahwa aplikasinya tidak ditolak?
Mehul Thakkar
67

Anda dapat mengubah warna tombol dengan menerapkan warna tint ke UIAlertController.

Di iOS 9, jika warna warna jendela diatur ke warna kustom, Anda harus menerapkan warna warna tepat setelah menampilkan peringatan. Jika tidak, warna rona akan disetel ulang ke warna rona jendela kustom Anda.

// 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()
Makukula
sumber
20
Untuk memperjelas, pengaturan tintColor setelah menampilkan pengontrol berfungsi pada iOS 8 dan 9, jadi tidak perlu mengaturnya dua kali.
arlomedia
Terima kasih telah menambahkan jawaban Swift dan solusi untuk masalah ini di iOS 9.
peacetype
3
Ketika saya mengetuk dan menyeret jari saya ke bawah, itu akan kembali ke warna default. Ada ide?
msmq
Ini benar-benar satu-satunya jawaban yang layak di sini.
TheCodingArt
47

Anda dapat mengubah warna teks tombol menggunakan kode ini:

alertC.view.tintColor = your color;

Mungkin ini akan membantu Anda.

ChintaN -Maddy- Ramani
sumber
@esilver Apakah Anda berhasil menemukan solusi yang berfungsi dengan iOS9?
Abu
1
Aku tidak. Saya membuat laporan bug dengan Apple, # 22391695.
esilver
1
Informasi lebih lanjut tentang ini. Tampaknya saat Anda menggulir dalam daftar item yang panjang, yang Anda sentuh untuk menggulir menjadi biru ...
Bejil
3
Tak satu pun dari ini bekerja pada UIAlertController di iOS9 dan 9.1 .. Tidak tahu apa yang Apple lakukan ... Perlu secara manual mengubah warna jendela setiap kali pengontrol peringatan dipanggil dan mengubahnya kembali di penangan.
Akhilesh Sharma
Ia bekerja dengan iOS 9.3, kecuali Anda menyentuh di luar: kembali ke sistem biru
Rémi Belzanti
35

Di 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)

}

Keluaran

Font, ukuran, dan warna kustom UIAlertController

Ashok R
sumber
Maaf bro, ini start up. Jika diperlukan dalam fitur saya akan memberitahu Anda ...
iOS
24

Terjemahan cepat dari jawaban @ dupuis2387. Mengerjakan sintaks untuk menyetel UIAlertControllerwarna dan font judul melalui KVC menggunakan attributedTitlekunci.

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)

masukkan deskripsi gambar di sini

Robert Chen
sumber
3
Bagaimana dengan tombol "OK"? Bisakah kita menyesuaikannya?
Hassan Taleb
@HassanTaleb Saya belum menemukan cara yang bagus untuk menyesuaikan tombol. Anda dapat menyetel tintColorpada viewatau melalui appearanceWhenContainedIn, tetapi rona akan hilang segera setelah Anda menyentuhnya. Masih mencari jawaban.
Robert Chen
@AbdulMomen عبدالمؤمن Pesan kesalahan apa yang Anda lihat? Potongan kode mengasumsikan FontAwesome sudah disiapkan.
Robert Chen
1
@RobertChen untuk memecahkan masalah cukup letakkan tint setelah:, self.presentViewController(alertController, animated: true, completion: nil)dapatkah kita mengubah font tombol "OK"?
Hassan Taleb
4
Bukankah ini dianggap sebagai api pribadi?
Jinghan Wang
13

Gunakan UIAppearanceprotokol. Contoh untuk mengatur font - buat kategori untuk diperluas 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

Dan penggunaannya:

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

Diuji dan bekerja dengan gaya UIAlertControllerStyleActionSheet, tapi saya rasa itu akan berhasil UIAlertControllerStyleAlertjuga.

PS Lebih baik memeriksa ketersediaan kelas daripada versi iOS:

if ([UIAlertController class]) {
    // UIAlertController code (iOS 8)
} else {
    // UIAlertView code (pre iOS 8)
}
Ivan
sumber
Ini berfungsi tetapi dengan cara ini saya tidak dapat memiliki ukuran yang berbeda untuk pesan dan untuk judul.
Libor Zapletal
Ini berfungsi tetapi ketika tindakan diklik, font kembali ke ukuran aslinya? Apakah ini terjadi pada Anda?
Larry
Saya memiliki masalah yang sama @ Larry dan saya belum menemukan cara untuk mengatasinya .. bukan?
alasker
12

Gunakan UIAppearanceprotokol. Lakukan lebih banyak peretasan dengan appearanceFontmengubah font UIAlertAction.

Buat kategori untuk 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

Pemakaian:

Menambahkan

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

di AppDelegate.muntuk membuatnya bekerja untuk semua UIAlertController.

pengguna3480295
sumber
Judul di iOS 8.3 adalah 13pt dan tebal jadi saya mengubah kondisinya menjadiif (self.font.pointSize == 13 && isBold) {
Andrew Raphael
Anda menyebutkan mengubah font untuk UIAlertAction. Tapi sejauh yang saya tahu, UIAlertActiontidak menggunakan a UILabel. Ini menggunakan NSString. github.com/nst/iOS-Runtime-Headers/blob/… Saya tidak tahu bagaimana Anda bisa menyesuaikan fonta NSString.
peacetype
UIAlertAction sama sekali bukan kelas tampilan. Ini adalah kelas abstrak yang mendeskripsikan tindakan. Tampilan itu sendiri kemudian dibuat di dalam UIAlertController. Oleh karena itu, Anda menyetel tampilan yang terdapat dalam UIAlertController.
mangerlahn
12

Swift 5 dan 5.1 . Buat file terpisah dan letakkan kode Kustomisasi UIAlertController di sana

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

Sekarang Pada tindakan apa pun Tampilkan Waspada

  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)
  }

Hasil

masukkan deskripsi gambar di sini

Gurjinder Singh
sumber
1
apakah kita mengakses Api pribadi di sini.? Sudahkah Anda merilis aplikasi dengan banyak properti lansiran khusus ini?
Yash Bedi
@YashBedi menggunakan API pribadi dan Apple mungkin menolak aplikasi Anda untuk penggunaan "API non-publik". Tidak, saya belum merilis aplikasi apa pun.
Gurjinder Singh
Ini disebutkan di situs pengembang Apple -> Penting Kelas UIAlertController dimaksudkan untuk digunakan sebagaimana adanya dan tidak mendukung subclass. Hierarki tampilan untuk kelas ini bersifat pribadi dan tidak boleh diubah.
Gurjinder Singh
Oke Boss Terima kasih.
Yash Bedi
@Darkglow Harap sebutkan kesalahannya. Saya berhasil membuat kode yang sama dengan swift 5.1
Gurjinder Singh
10

Saya sedang menggunakannya.

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

Tambahkan satu baris (AppDelegate) dan berfungsi untuk semua UIAlertController.

Lucas Torquato
sumber
3
Karena ini sekarang tidak digunakan lagi, gunakan [[UIView appearanceWhenContainedInstancesOfClasses: @ [[UIAlertController class]]] setTintColor: newColor]; sebagai gantinya
Peter Johnson
8

Cepat 4

Contoh font khusus pada judul. Hal yang sama untuk komponen lain seperti pesan atau tindakan.

    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)
AnthonyR
sumber
5

Berikut adalah ekstensi untuk Swift 4.1 dan 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")

}}
Vassilis A. Alexiou
sumber
4

Saya baru saja menyelesaikan penggantinya UIAlertController. Ini adalah satu-satunya cara yang masuk akal, saya pikir:


Tua

Inilah metode saya di Swift yang mengumpulkan banyak informasi dari jawaban di sini

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)
        }
    }
}

Ini berfungsi dalam beberapa situasi dengan sempurna, dan dalam situasi lain gagal total (warna tint tidak ditampilkan seperti yang diharapkan).

Dan Rosenstark
sumber
4

Anda dapat menggunakan perpustakaan eksternal seperti PMAlertController tanpa solusi alternatif, di mana Anda dapat mengganti UIAlertController Apple yang tidak dapat disesuaikan dengan peringatan yang sangat dapat disesuaikan.

Kompatibel dengan Xcode 8, Swift 3 dan Objective-C

Contoh PMAlertController


Fitur:

  • [x] Tampilan Header
  • [x] Gambar Header (Opsional)
  • [x] Judul
  • [x] Pesan deskripsi
  • [x] Kustomisasi: font, warna, dimensi & lainnya
  • [x] 1, 2 tombol (horizontal) atau 3+ tombol (vertikal)
  • [x] Tutup saat tombol ditekan
  • [x] Dukungan Bidang Teks
  • [x] Implementasi yang mirip dengan UIAlertController
  • [x] Cocoapods
  • [x] Kartago
  • [x] Animasi dengan UIKit Dynamics
  • [x] Kompatibilitas Objective-C
  • [x] Dukungan Swift 2.3 & Swift 3
Paolo Musolino
sumber
Apakah PMAlertController mengizinkan pembungkus kata ketika teksnya panjang di tombol tindakan?
zeeple
@zeeple menganggap bahwa tombol tindakan adalah subkelas UIButton. Sesuatu seperti itu actionButton.titleLabel.lineBreakMode = NSLineBreakByWordWrappingbekerja dengan baik.
Paolo Musolino
3

Ada masalah dengan pengaturan warna rona pada tampilan setelah disajikan; bahkan jika Anda melakukannya di blok penyelesaian presentViewController: animated: penyelesaian :, ini menyebabkan efek flicker pada warna judul tombol. Ini ceroboh, tidak profesional, dan sama sekali tidak dapat diterima.

Solusi lain yang disajikan bergantung pada hierarki tampilan yang tetap statis, sesuatu yang tidak disukai Apple. Berharap solusi tersebut gagal dalam rilis iOS mendatang.

Satu-satunya cara yang pasti untuk memecahkan masalah ini dan melakukannya di mana-mana, adalah dengan menambahkan kategori ke UIAlertController dan swizzling viewWillAppear.

Header:

//
//  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

Pelaksanaan:

//
//  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

Tambahkan .pch (header yang telah dikompilasi) ke proyek Anda dan sertakan kategori:

#import "UIAlertController+iOS9TintFix.h"

Pastikan Anda mendaftarkan pch Anda dalam proyek dengan benar, dan itu akan menyertakan metode kategori di setiap kelas yang menggunakan UIAlertController.

Kemudian, dalam metode delegasi aplikasi Anda didFinishLaunchingWithOptions, impor kategori dan panggilan Anda

[UIAlertController tintFix];

dan secara otomatis akan menyebar ke setiap instance UIAlertController dalam aplikasi Anda, baik diluncurkan oleh kode Anda atau orang lain.

Solusi ini berfungsi untuk iOS 8.X dan iOS 9.X dan tidak memiliki kedipan pendekatan perubahan warna setelah presentasi. Ini juga sepenuhnya agnostik sehubungan dengan hierarki tampilan dari sub-tampilan UIAlertController.

Selamat meretas!

ObiDan
sumber
Solusi ini sebagian besar berfungsi. Namun, pada perangkat yang berputar, warnanya kembali ke semula, sebelum desis.
Dhiraj Gupta
Dhiraj, saya baru saja menguji ini lagi dalam pengaturan proyek secara eksplisit untuk mengeksplorasi temuan Anda, dan saya tidak setuju. Warnanya tidak kembali seperti semula saat diputar.
ObiDan
Fungsional yang diverifikasi pada xcode 6.4, dan xcode 7.0. Menjalankan simulator dari semua variasi 8.X dan 9.0. Jika diminta, saya akan memasang proyek di github.
ObiDan
Anda dapat melanjutkan dan membuat proyek, tetapi inilah yang saya lihat terjadi pada saya. Itu juga tidak berfungsi di iPad. Berdasarkan ide metode swizzling Anda, bagaimanapun, saya adalah mampu membuatnya bekerja dengan swizzling viewDidLayoutSubviews, meskipun.
Dhiraj Gupta
Jika Anda membuat sebuah proyek, maka saya dapat mengirimkan permintaan tarik dengan swizzle viewDidLayoutSubviews, yang baru saja saya gunakan dan kirimkan dalam versi terbaru aplikasi saya ke App Store dan Anda dapat melihatnya, mungkin?
Dhiraj Gupta
3

Silakan temukan kategori ini . Saya dapat mengubah FONT dan Warna UIAlertAction dan UIAlertController.

Menggunakan:

UILabel * appearanceLabel = [UILabel appearanceWhenContainedIn:UIAlertController.class, nil];
[appearanceLabel setAppearanceFont:yourDesireFont]];  
Arpan Dixit
sumber
5
Silakan, tempel kode di sini atau gunakan layanan yang tidak mengharuskan orang untuk login.
Sulthan
3

Di Swift 4.1 dan 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)
})
iOS
sumber
jawaban Anda perlu diperbarui, self.present(alertController, animated: true)atau self.present(alert, animated: true).
Yash Bedi
@Yash Bedi, terima kasih saya memperbarui jawaban saya, silakan periksa sekali.
iOS
2

Solusi / Hack untuk 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");
    }];
Akhilesh Sharma
sumber
Saya mencoba ini. Perhatikan bahwa Anda mengembalikan pengaturan warna jendela setelah pengontrol peringatan ditampilkan. Saya melihat warna beralih kembali tepat di pengontrol peringatan. Saya percaya penghormatan harus dilakukan setelah tindakan apa pun disadap.
Germán
Terima kasih @ Germán karena telah menunjukkan hal itu .. Membuat perubahan pada kode. Saya menangani pengembalian di AlertAction mulai sekarang .. Tapi ya, saya setuju bahwa itu juga dapat ditangani di penangan dimiss
Akhilesh Sharma
1

Saya bekerja untuk Urban Outfitters. Kami memiliki pod open source URBNAlert, yang kami gunakan di semua aplikasi kami. Ini didasarkan padaUIAlertController , tetapi sangat dapat disesuaikan.

Sumber di sini: https://github.com/urbn/URBNAlert

Atau cukup instal pod dengan menempatkannya URBNAlertdi Podfile Anda

Berikut beberapa contoh kode:

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];
RyanG
sumber
Apakah ini mendukung gaya ActionSheet?
Danpe
@Danpe tidak, ini murni hanya untuk Alerts .. Bisa dikatakan .. jika itu adalah sesuatu yang Anda inginkan, buat masalah di repo. Itu adalah sesuatu yang telah kita diskusikan tentang penambahan dukungan sebelumnya
RyanG
1

Untuk mengubah warna satu tombol seperti CANCEL menjadi warna merah, Anda dapat menggunakan properti gaya ini yang disebut 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);
Kazim Ahmad
sumber
1

Untuk iOS 9.0 dan yang lebih baru, gunakan kode ini di app delegate

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

Swift 5.0.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")
Hiren Panchal
sumber
0

Agak kikuk, tapi ini berfungsi untuk saya sekarang untuk mengatur warna latar belakang dan teks. Saya menemukannya di sini .

UIView * firstView = alertController.view.subviews.firstObject;
    UIView * nextView = firstView.subviews.firstObject;
    nextView.backgroundColor = [UIColor blackColor];
TheGeezer
sumber
Ini berfungsi untuk warna latar belakang tetapi tidak pernah mengubah warna tint, inilah yang membuat saya agak bingung
Akhilesh Sharma
0

Saya telah membuat satu metode objektif-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];
}

Kode berjalan sempurna di Xcode 8.3.1. Anda dapat menyesuaikan sesuai kebutuhan.

Alok
sumber
0

Saya hanya menggunakan permintaan semacam ini, tampaknya dan sistem, detailnya sedikit berbeda, jadi kami ... OC menyadari enkapsulasi jendela popup Alert dan Sheet.

Sering ditemui dalam perkembangan sehari-hari perlu menambahkan angka ke Waspada atau mengubah warna tombol, seperti "sederhana" permintaan, hari ini membawa dan komponen sistem yang sangat mirip dan sepenuhnya dapat memenuhi permintaan komponen kemasan yang disesuaikan.

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

Tim
sumber