UIAlertController özel yazı tipi, boyut, renk


118

Uyarıları göstermek için yeni UIAlertController kullanıyorum. Bu koda sahibim:

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

Şimdi başlık ve mesaj yazı tipini, rengini, boyutunu vb. Değiştirmek istiyorum. Bunu yapmanın en iyi yolu nedir?

Düzenleme: Kodun tamamını eklemeliyim. UIView için iOS sürümü için doğru uyarıyı gösterebileceğim bir kategori oluşturdum.

@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:Aşağıdaki cevapları okuyan herkese. Apple, uygulamalarınızı reddedecek. Herhangi bir özel API (ler) kullanma eğilimindeyseniz. Ve aşağıdaki cevaplarda OLAN ŞEY ..
Yash Bedi

Yanıtlar:


98

Bunun özel API'lere / mülklere aykırı olup olmadığından emin değilim, ancak KVC'yi kullanmak ios8'de benim için çalışıyor

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

Kayıt için, bu özel API'leri kullanarak uyarı eyleminin yazı tipini değiştirmek de mümkündür. Yine, uygulamanızın reddedilmesine neden olabilir, henüz böyle bir kodu göndermeyi denemedim.

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'da Swift 4.2 ve son 2 satır şu anda:

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

6
İşe yarıyor. attributedTitlebaşlık ve attributedMessagemesaj için. En iyi çözüm olup olmadığından emin değilim ama şimdilik benim için yeterince iyi.
Libor Zapletal

2
UIAlertController düğmelerine ekleyebileceğimiz tüm özelleştirmeler nelerdir?
Aanchal Chaurasia

1
Teşekkürler! Küçük bir sorum var - özellik kutucuğu ve mesaj içeriğiyle özel yazı tipleri ve renkler kullanılabilir UIAlertController. Nasıl aynı şey yapılabilir UIAlertAction?
p0lAris

72
Umarım hiçbiriniz bunu uygulama mağazasında özel API'ler kullandığı için yayınlamayı planlamıyorsunuzdur. Cidden, bu cevapların gerçekte "cevaplar" olmadıkları halde Stackoverflow'da neden kabul edildiğine dair hiçbir fikrim yok. Bunlar, uygulama mağazasında yayınlamaktan kurtulabileceğiniz veya alamayacağınız hack'lerdir.
TheCodingArt

3
Uygulamanın uygulama mağazasında yayınlanması durumunda, bazı özel API kullanımlarına Apple tarafından izin verilir, ancak kullanıcının sistemine / gizliliğine zarar verebilecek veya etkileyebilecek api'leri kullanmamalıdır. Yani, muhtemelen bu cevap pek çok kişi tarafından sadece bundan dolayı kabul edilebilir. Ve muhtemelen uygulama mağazasını etkilemiyor olabilir. Bunu kullanan biri, uygulamasının reddedilmediğini doğrulayabilir mi?
Mehul Thakkar

67

Bir UIAlertController'a renk tonu uygulayarak düğme rengini değiştirebilirsiniz.

İOS 9'da, pencere renk tonu rengi özel bir renge ayarlanmışsa, uyarıyı sunduktan hemen sonra renk tonu rengini uygulamanız gerekir. Aksi takdirde, ton rengi, özel pencere tonu renginize sıfırlanacaktır.

// 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
Netleştirmek için, denetleyiciyi sunduktan sonra tintColor'u ayarlamak hem iOS 8 hem de 9'da çalışır, bu nedenle iki kez ayarlamaya gerek yoktur.
arlomedia

İOS

3
Parmağıma dokunup aşağı sürüklediğimde tekrar varsayılan renge dönecek. Herhangi bir fikir?
msmq

Bu gerçekten buradaki tek düzgün cevap.
TheCodingArt

47

Bu kodu kullanarak düğme metninin rengini değiştirebilirsiniz:

alertC.view.tintColor = your color;

Belki bu size yardımcı olur.


@esilver, iOS9 ile çalışan bir çözüm bulmayı başardınız mı?
Kül

1
Yapmadım. Apple ile bir hata raporu oluşturdum, # 22391695.
esilver

1
Bununla ilgili daha fazla bilgi. Görünüşe göre uzun bir liste öğelerini
kaydırdığınızda

3
Bunların hiçbiri iOS9 ve 9.1'deki UIAlertController üzerinde çalışmaz. Apple çalışanlarının neler yaptığını bilmiyorum ... Her uyarı denetleyicisi çağrıldığında pencere renk tonunu manuel olarak değiştirmeniz ve işleyicide yeniden değiştirmeniz gerekir.
Akhilesh Sharma


35

Xcode 8 Swift 3.0'da

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

}

Çıktı

UIAlertController özel yazı tipi, boyutu ve rengi


Üzgünüm kardeşim, bu başlangıç. Özellik için gerekliyse size bilgi vereceğim ...
iOS

24

@ Dupuis2387 yanıtının hızlı çevirisi. Anahtar UIAlertControllerkullanarak KVC aracılığıyla başlığın rengini ve yazı tipini ayarlamak için sözdizimi çalıştı 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)

görüntü açıklamasını buraya girin


3
Peki ya "Tamam" düğmesi? Onu özelleştirebilir miyiz?
Hassan Taleb

@HassanTaleb Düğmeyi özelleştirmenin harika bir yolunu bulamadım. Sen ayarlayabilirsiniz tintColorüzerinde viewveya aracılığıyla appearanceWhenContainedIn, ama tonu kısa sürede dokunma gibi uzağa gider. Yine de cevaplar arıyorum.
Robert Chen

@AbdulMomen عبدالمؤمن Hangi hata mesajını görüyorsunuz? Kod parçacığı FontAwesome'nın zaten kurulmuş olduğunu varsayar.
Robert Chen

1
@RobertChen sorunu çözmek için renk tonunu sonraya koyun:, self.presentViewController(alertController, animated: true, completion: nil)"Tamam" düğmesinin yazı tipini değiştirebilir miyiz?
Hassan Taleb

4
Bu özel bir API olarak kabul edilmiyor mu?
Jinghan Wang

13

UIAppearanceProtokol kullanın . Yazı tipi ayarlama örneği - genişletmek için bir kategori oluşturun 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

Ve kullanımı:

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

Test edildi ve stille çalışıyor UIAlertControllerStyleActionSheet, ama sanırım bu da işe yarayacak UIAlertControllerStyleAlert.

PS iOS sürümü yerine sınıf kullanılabilirliğini daha iyi kontrol edin:

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

Çalışıyor ama bu şekilde mesaj ve başlık için farklı boyuta sahip olamam.
Libor Zapletal

Bu çalışır, ancak bir eylem tıklandığında yazı tipi orijinal boyutuna geri döner. Bu senin için olur mu?
Larry

Aynı problemim var @Larry ve bununla başa çıkmanın bir yolunu bulamadım .. değil mi?
alasker

12

UIAppearanceProtokol kullanın . appearanceFontYazı tipini değiştirmek için ile daha fazla hack yapın UIAlertAction.

İçin bir kategori oluşturun 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

Kullanımı:

Ekle

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

içinde AppDelegate.mherkes için çalışmasını sağlamak için UIAlertController.


İOS 8.3'teki başlık 13pt ve kalın olduğundan, koşulu şu şekilde değiştirdimif (self.font.pointSize == 13 && isBold) {
Andrew Raphael

İçin yazı tipini değiştirmekten bahsetmiştin UIAlertAction. Ama anlayabildiğim kadarıyla UIAlertActiona kullanmıyor UILabel. Bir NSString. github.com/nst/iOS-Runtime-Headers/blob/… Bir NSString.
barış tipi

UIAlertAction hiç bir görünüm sınıfı değildir. Eylemi tanımlayan soyut bir sınıftır. Görünümün kendisi daha sonra UIAlertController içinde oluşturulur. Bu nedenle, UIAlertController'da bulunan görünümü ayarlarsınız.
mangerlahn

12

Swift 5 ve 5.1 . Ayrı bir dosya oluşturun ve UIAlertController Özelleştirme kodunu buraya yerleştirin

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

Şimdi herhangi bir işlemde Uyarıyı Göster

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

Sonuç

görüntü açıklamasını buraya girin


1
Burada herhangi bir özel API'ye erişiyor muyuz? Bu birçok özel uyarı özelliğine sahip herhangi bir uygulama yayınladınız mı?
Yash Bedi

@YashBedi, özel API'ler kullanıyor ve Apple, uygulamanızı "halka açık olmayan API" kullanımı nedeniyle reddedebilir. Hayır, herhangi bir uygulama yayınlamadım.
Gurjinder Singh

Bu, Apple geliştirici sitesinde belirtilmiştir -> Önemli UIAlertController sınıfının olduğu gibi kullanılması amaçlanmıştır ve alt sınıflamayı desteklemez. Bu sınıf için görünüm hiyerarşisi özeldir ve değiştirilmemelidir.
Gurjinder Singh

Anladım Patron Teşekkürler.
Yash Bedi

@Darkglow Lütfen hatayı belirtin. Aynı kodu hızlı 5.1 ile başarıyla oluşturabiliyorum
Gurjinder Singh

10

Onu kullanıyorum.

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

Bir satır ekleyin (AppDelegate) ve tüm UIAlertController için çalışır.


3
Bu artık kullanımdan kaldırıldığı için, [[UIView görünümWhenContainedInInstancesOfClasses: @ [[UIAlertController class]]] setTintColor: newColor]; bunun yerine
Peter Johnson

8

Swift 4

Başlıktaki özel yazı tipi örneği. Mesaj veya eylemler gibi diğer bileşenler için aynı şeyler.

    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 ve Xcode 9.4.1 için bir uzantı:

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

Yerine yenisini tamamladım UIAlertController. Bu , gitmenin tek mantıklı yolu, bence:


Eski

İşte buradaki cevaplardan birçok bilgiyi birleştiren Swift'deki yöntemim

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

Bu, bazı durumlarda mükemmel çalışır ve diğerlerinde tamamen başarısız olur (renk tonları beklendiği gibi görünmez).


4

Apple'ın özelleştirilemeyen UIAlertController'ı süper özelleştirilebilir bir uyarı ile değiştirebileceğiniz geçici çözümü kullanmadan PMAlertController gibi harici bir kitaplık kullanabilirsiniz .

Xcode 8, Swift 3 ve Objective-C ile uyumlu

PMAlertController örneği


Özellikleri:

  • [x] Başlık Görünümü
  • [x] Üstbilgi Resmi (İsteğe Bağlı)
  • [x] Başlık
  • [x] Açıklama mesajı
  • [x] Özelleştirmeler: yazı tipleri, renkler, boyutlar ve daha fazlası
  • [x] 1, 2 düğme (yatay) veya 3+ düğme (dikey)
  • [x] Bir düğmeye basıldığında kapatma
  • [x] Metin Alanları desteği
  • [x] UIAlertController'a benzer uygulama
  • [x] Cocoapod'lar
  • [x] Kartaca
  • [x] UIKit Dynamics ile Animasyon
  • [x] Objective-C uyumluluğu
  • [x] Swift 2.3 ve Swift 3 desteği

PMAlertController, metin eylem düğmelerinde uzun olduğunda sözcük kaydırmaya izin veriyor mu?
zeeple

@zeeple, eylem düğmesinin UIButton'un bir alt sınıfı olduğunu düşünür. Bunun gibi bir şey actionButton.titleLabel.lineBreakMode = NSLineBreakByWordWrappingiyi çalışıyor.
Paolo Musolino

3

Sunumdan sonra görünümde ton renginin ayarlanmasında bir sorun var; Bunu presentViewController: animated: complete: tamamlama bloğunda yapsanız bile, düğme başlıklarının renginde titreme etkisine neden olur. Bu özensiz, profesyonelce ve tamamen kabul edilemez.

Sunulan diğer çözümler, Apple'ın yapmaktan nefret ettiği bir şey olan statik kalan görünüm hiyerarşisine bağlıdır. İOS'un gelecekteki sürümlerinde bu çözümlerin başarısız olmasını bekleyin.

Bu sorunu çözmenin ve bunu her yerde yapmanın kesin yolu, UIAlertController'a bir kategori eklemek ve viewWillAppear'ı döndürmektir.

Başlık:

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

Hayata geçirme:

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

Projenize bir .pch (önceden derlenmiş başlık) ekleyin ve kategoriyi dahil edin:

#import "UIAlertController+iOS9TintFix.h"

PC'nizi projeye doğru şekilde kaydettiğinizden emin olun ve UIAlertController'ı kullanan her sınıfta kategori yöntemlerini içerecektir.

Ardından, uygulamanızın delegeleri didFinishLaunchingWithOptions yönteminde, kategorinizi içe aktarın ve

[UIAlertController tintFix];

ve ister kodunuz tarafından ister başka biri tarafından başlatılmış olsun, uygulamanızdaki her bir UIAlertController örneğine otomatik olarak yayılacaktır.

Bu çözüm, hem iOS 8.X hem de iOS 9.X için çalışır ve sunum sonrası renk tonu değişikliği yaklaşımının titremesinden yoksundur. Ayrıca UIAlertController'ın alt görünümlerinin görünüm hiyerarşisine göre de tamamen agnostiktir.

Mutlu hacklemeler!


Bu çözüm çoğunlukla işe yarıyor. Bununla birlikte, cihaz döndürüldüğünde, renk tonları, dönmeden önceki haline geri döner.
Dhiraj Gupta

Dhiraj, bulgularını açık bir şekilde incelemek için bunu bir proje kurulumunda tekrar test ettim ve aynı fikirde değilim. Renk tonu, dönme biçimine geri dönmüyor.
ObiDan

Xcode 6.4 ve xcode 7.0'da işlevselliği doğrulandı. 8.X ve 9.0'ın tüm varyasyonlarının çalışan simülatörleri. İstenirse, projeyi github'a koyacağım.
ObiDan

Pekala, devam edip bir proje ortaya koyabilirsin, ama benim de başıma geldiğini görüyorum. Ayrıca iPad üzerinde de çalışmıyordu. Senin yöntem swizzling fikri dayanarak, ancak ben oldu gerçi, swizzling viewDidLayoutSubviews tarafından o iş yapmak mümkün.
Dhiraj Gupta

Bir proje hazırlarsanız, viewDidLayoutSubviews swizzle ile bir çekme talebi gönderebilirim, bu az önce kullandığım ve uygulamamın en son sürümünde App Store'a gönderdim ve bir göz atabilirsin, belki?
Dhiraj Gupta

3

Lütfen bu kategoriyi bulun . UIAlertAction ve UIAlertController'ın FONT ve Rengini değiştirebiliyorum.

kullanın:

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

5
Lütfen kodu buraya yapıştırın veya kişilerin oturum
açmasını

3

Swift 4.1 ve Xcode 10'da

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

cevabınızın güncellenmesi gerekiyor self.present(alertController, animated: true)veya self.present(alert, animated: true).
Yash Bedi

@Yash Bedi, teşekkür ederim cevabımı güncelledim lütfen bir kez kontrol et.
iOS

2

İOS9 için Çözüm / Hack

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

Bunu denedim. Uyarı denetleyicisi sunulduğunda pencere tonu ayarını geri aldığınızı unutmayın. Uyarı denetleyicisinde renk değişimini görüyorum. Herhangi bir eyleme geçildiğinde saygı duyulması gerektiğine inanıyorum.
Germán

Teşekkürler @ Germán bunu belirttiğiniz için .. Kodda değişiklik yaptı. Şu an itibariyle AlertAction'da geri dönüşü yapıyorum .. Ama evet bunun dimiss işleyicide de ele alınabileceğini kabul ediyorum
Akhilesh Sharma

1

Urban Outfitters için çalışıyorum. URBNAlertTüm uygulamalarımızda kullandığımız açık kaynaklı bir podumuz var . Dayalı UIAlertController, ancak son derece özelleştirilebilir.

Kaynak burada: https://github.com/urbn/URBNAlert

Veya URBNAlertPodfile'ınıza yerleştirerek bölme tarafından kurun

İşte bazı örnek kodlar:

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

Bu, ActionSheet stilini destekliyor mu?
Danpe

@Danpe yok, sadece Uyarılar içindir .. Öyle söyleniyor .. eğer arzuladığınız bir şey varsa depoda bir sorun yaratır. Bu, daha önce destek eklemeyi tartıştığımız bir şey
RyanG

1

CANCEL gibi bir düğmenin rengini kırmızı renge dönüştürmek için, UIAlertActionStyle.destructive adlı bu stil özelliğini kullanabilirsiniz:

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

İOS 9.0 ve üstü için uygulama temsilcisinde bu kodu kullanın

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

Biraz hantal, ama bu şu anda arka plan ve metin renklerini ayarlamak için işe yarıyor. Burada buldum .

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

Arka plan rengi için çalışıyor ancak ton rengini asla değiştirmiyor, kafam biraz karıştı
Akhilesh Sharma

0

Bir yöntem hedefi oluşturdum-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];
}

Kod, Xcode 8.3.1 üzerinde mükemmel şekilde çalışıyor. İhtiyaca göre özelleştirebilirsiniz.


0

Ben sadece bu tür bir talep kullanıyorum, görünüşte ve sistem, detaylar biraz farklı, bu yüzden ... OC fark etti Uyarı ve Sayfa açılır pencere kapsüllemesi.

Günlük geliştirmede sıklıkla karşılaşılan, Alert'e bir rakam eklemek veya "basit" talep gibi bir düğme rengini değiştirmek, bugün oldukça benzer bir ve sistem bileşenleri getiriyor ve özelleştirilmiş paketleme bileşenlerinin talebini tam olarak karşılayabilir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.