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 का उपयोग करते हैं। और नीचे जवाब में यह नहीं है कि क्या हो रहा है ..
यश बेदी

जवाबों:


98

यह निश्चित नहीं है कि यह निजी APIs / संपत्तियों के खिलाफ है, लेकिन KVC का उपयोग 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"];

रिकॉर्ड के लिए, उन निजी एपीआई का उपयोग करके अलर्ट एक्शन के फ़ॉन्ट को भी बदलना संभव है। फिर से, यह आपको एप्लिकेशन अस्वीकृत कर सकता है, मैंने अभी तक इस तरह के कोड को प्रस्तुत करने की कोशिश नहीं की है।

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 में स्विफ्ट 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संदेश के लिए। यकीन नहीं है कि यह सबसे अच्छा समाधान है, लेकिन अभी के लिए यह मेरे लिए काफी अच्छा है।
लिबोर जैपलेटल

2
क्या सभी अनुकूलन हम UIAlertController बटन पर जोड़ सकते हैं ??
आंचल चौरसिया

1
धन्यवाद! मेरे पास एक छोटा सा सवाल है - कोई कस्टम टाइल और रंगों का उपयोग कर सकता है जिसमें विशेषता टाइल और संदेश शामिल हो सकते हैं UIAlertController। एक ही साथ कैसे कर सकता है UIAlertAction?
p0lAris

72
मुझे आशा है कि आप में से कोई भी इसे ऐप स्टोर पर जारी करने की योजना नहीं बना रहा है क्योंकि यह निजी एपीआई का उपयोग करता है। सच में, मुझे पता नहीं क्यों इन जवाबों को कभी Stackoverflow पर स्वीकार कर लिया जाता है जब वे वास्तव में 'उत्तर' नहीं होते हैं। ये वे हैक हैं जो आपको एप्लिकेशन स्टोर में प्रकाशन के साथ दूर हो सकते हैं या नहीं।
theCodingArt

3
ऐप स्टोर पर ऐप जारी करने के मामले में, ऐप्पल द्वारा कुछ निजी एपीआई उपयोग की अनुमति है, लेकिन इसमें ऐपिस का उपयोग नहीं करना चाहिए जो उपयोगकर्ता के सिस्टम / गोपनीयता को नुकसान पहुंचा सकता है या प्रभावित कर सकता है। तो, संभवतः इस उत्तर को केवल इस कारण से कई लोगों द्वारा स्वीकार किया जा सकता है। और शायद यह ऐप स्टोर पर असर नहीं कर रहा है। क्या जिसने इसका इस्तेमाल किया है, क्या वे इस बात की पुष्टि कर सकते हैं कि उनका ऐप खारिज नहीं किया गया है?
मेहुल ठक्कर

66

आप एक TIA रंग को 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
स्पष्ट करने के लिए, नियंत्रक 8 को iOS 8 और 9 दोनों पर काम करने के बाद टिंटकलर सेट करना है, इसलिए इसे दो बार सेट करना आवश्यक नहीं है।
अर्लोमेडिया

आईओएस 9 में इस मुद्दे के लिए एक स्विफ्ट उत्तर और एक वर्कअराउंड जोड़ने के लिए धन्यवाद।
peacetype

3
जब मैं अपनी उंगली को टैप और ड्रैग करता हूं, तो यह फिर से डिफॉल्ट कलर में चला जाता है। कोई उपाय?
msmq

यह वास्तव में यहाँ केवल एक अच्छा जवाब है।
theCodingArt

47

आप इस कोड का उपयोग करके बटन टेक्स्ट का रंग बदल सकते हैं:

alertC.view.tintColor = your color;

शायद इससे आपको मदद मिलेगी।


@esilver ने iOS9 के साथ काम करने वाले समाधान को खोजने का प्रबंधन किया?
ऐश

1
मैंने नहीं। मैंने Apple के साथ एक बग रिपोर्ट बनाई, # 22391695।
एविल

1
इस बारे में अधिक जानकारी। ऐसा लगता है कि जब आप एक लंबी सूची आइटम में स्क्रॉल करते हैं, तो आप जिस पर स्क्रॉल करने के लिए स्पर्श करते हैं वह नीला हो जाता है ...
बेजल

3
IOS9 और 9 में UIAlertController पर इस काम में से कोई भी नहीं है। न ही पता है कि Apple लोग क्या कर रहे हैं ... मैन्युअल रूप से विंडो टिंट को बदलने की आवश्यकता हर बार एक चेतावनी नियंत्रक को बुलाया जाता है और इसे वापस हैंडलर में बदल देता है।
अखिलेश शर्मा

यह iOS 9.3 के साथ काम करता है, जब तक कि आप आउटसाइड को नहीं छूते हैं: सिस्टम ब्लू पर वापस आता है
Rémi Belzanti

35

Xcode 8 स्विफ्ट 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

@ द्वंद्व 2387 उत्तर का एक स्विफ्ट अनुवाद। UIAlertControllerशीर्षक का रंग और फ़ॉन्ट केवीसी के माध्यम से सेट करने के लिए 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
"ओके" बटन के बारे में क्या? क्या हम इसे अनुकूलित कर सकते हैं?
हसन तलेब

@ हसनटैलब मुझे बटन को अनुकूलित करने का एक शानदार तरीका नहीं मिला। आप tintColorपर viewया उसके माध्यम से सेट कर सकते हैं appearanceWhenContainedIn, लेकिन जैसे ही आप इसे छूते हैं, टिंट चला जाता है। हालांकि अभी भी जवाब खोज रहे हैं।
रॉबर्ट चेन

@AbdulMomen عبدالمنمن आप क्या त्रुटि संदेश देख रहे हैं? कोड स्निपेट मान लेता है कि FontAwesome पहले से ही सेट है।
रॉबर्ट चेन

1
@RobertChen के बाद समस्या को हल करने के लिए सिर्फ टिंट लगाएं: self.presentViewController(alertController, animated: true, completion: nil)क्या हम बटन "OK" के फॉन्ट को बदल सकते हैं?
हसन तलेब

4
क्या यह एक निजी एपीआई नहीं माना जाता है?
जिंगान वांग

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

यह काम कर रहा है, लेकिन इस तरह मेरे पास संदेश के लिए और शीर्षक के लिए अलग-अलग आकार नहीं हो सकते।
लिबोर जैपलेटल

यह काम करता है लेकिन जब किसी कार्रवाई पर क्लिक किया जाता है, तो फ़ॉन्ट मूल आकार में वापस आ जाता है? क्या आपके लिए ऐसा होता है?
लैरी

मेरे पास एक ही समस्या है @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 में शीर्षक 13pt और बोल्ड है इसलिए मैंने इस शर्त को बदल दियाif (self.font.pointSize == 13 && isBold) {
एंड्रयू राफेल

आपने फ़ॉन्ट बदलने का उल्लेख किया है UIAlertAction। लेकिन जहाँ तक मैं बता सकता हूँ, UIAlertActionएक का उपयोग नहीं करता है UILabel। यह एक का उपयोग करता है NSStringgithub.com/nst/iOS-Runtime-Headers/blob/… मुझे नहीं पता कि आप फ़ॉन्ट को कैसे कस्टमाइज़ कर सकते हैं NSString
21

UIAlertAction एक दृश्य वर्ग नहीं है। यह एक अमूर्त वर्ग है जो क्रिया का वर्णन करता है। यह दृश्य तब UIAlertController के अंदर उत्पन्न होता है। इसलिए आप UIAlertController में निहित उपस्थिति निर्धारित करते हैं।
मँगरलहं

12

स्विफ्ट 5 और 5.1 । एक अलग फ़ाइल बनाएं और वहां UIAlertController Customization कोड डालें

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 के यहाँ पहुँच रहे हैं? क्या आपने इन कई कस्टम अलर्ट गुणों के साथ कोई ऐप जारी किया है?
यश बेदी

@YashBedi यह निजी APIs का उपयोग कर रहा है और Apple आपके एप्लिकेशन को "गैर-सार्वजनिक API" उपयोग के लिए अस्वीकार कर सकता है। नहीं, मैंने कोई ऐप जारी नहीं किया है।
गुरजिंदर सिंह

यह Apple डेवलपर साइट पर उल्लेख किया गया है -> महत्वपूर्ण UIAlertController वर्ग का उपयोग-के रूप में करने का इरादा है और उपवर्ग का समर्थन नहीं करता है। इस वर्ग के लिए पदानुक्रम दृश्य निजी है और इसे संशोधित नहीं किया जाना चाहिए।
गुरजिंदर सिंह

समझ गया बॉस धन्यवाद।
यश बेदी

@Darkglow त्रुटि का उल्लेख करें। मैं स्विफ्ट 5.1 के साथ सफलतापूर्वक एक ही कोड बनाने में सक्षम हूं
गुरजिंदर सिंह

10

मैं इसका उपयोग कर रहा हूँ।

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

एक पंक्ति (AppDelegate) जोड़ें और सभी UIAlertController के लिए काम करता है।


3
के रूप में यह अब पदावनत किया गया है, [[UIView प्रकटनWhenContainInInstancesOfClasses: @ [[UIAlertController वर्ग]]] 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यह जाने का एकमात्र समझदार तरीका है, मुझे लगता है:


पुराना

यहाँ स्विफ्ट में मेरा तरीका है जो यहाँ उत्तर से बहुत सारी जानकारी को मिटा देता है

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, स्विफ्ट 3 और ऑब्जेक्टिव-सी के साथ संगत

PMAlertController उदाहरण


विशेषताएं:

  • [x] हेडर व्यू
  • [x] हेडर इमेज (वैकल्पिक)
  • [एक्स] शीर्षक
  • [x] विवरण संदेश
  • [x] अनुकूलन: फोंट, रंग, आयाम और अधिक
  • [x] १, २ बटन (क्षैतिज रूप से) या ३+ बटन (लंबवत)
  • [x] जब कोई बटन दबाया जाता है तब बंद हो जाता है
  • [x] पाठ फ़ील्ड समर्थन करते हैं
  • [x] UIAlertController के समान कार्यान्वयन
  • [x] कोकोपोड्स
  • [एक्स] कार्थेज
  • [x] UIKit डायनेमिक्स के साथ एनीमेशन
  • [x] उद्देश्य-सी अनुकूलता
  • [x] स्विफ्ट २.३ और स्विफ्ट ३ सपोर्ट

क्या PMAlertController शब्द रैप के लिए अनुमति देता है जब पाठ कार्रवाई बटन में लंबा होता है?
zeeple

@ जिपल का मानना ​​है कि एक्शन बटन यूबूटन का एक उपवर्ग है। कुछ ऐसा actionButton.titleLabel.lineBreakMode = NSLineBreakByWordWrappingही काम करता है।
पाओलो मुसोलिनो

3

प्रस्तुत करने के बाद दृश्य पर टिंट रंग सेट करने में समस्या है; भले ही आप इसे presentViewController के पूर्ण ब्लॉक में करते हैं: एनिमेटेड: पूरा करना :, यह बटन के शीर्षक के रंग पर एक झिलमिलाना प्रभाव का कारण बनता है। यह मैला, अव्यवसायिक और पूरी तरह से अस्वीकार्य है।

प्रस्तुत अन्य समाधान दृश्य पदानुक्रम शेष स्थिर पर निर्भर करते हैं, कुछ ऐसा है जो Apple करने के लिए घृणा करता है। आईओएस के भविष्य के रिलीज में विफल होने के लिए उन समाधानों की अपेक्षा करें।

इस समस्या को हल करने और इसे हर जगह करने का एक निश्चित तरीका है, 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 के उप-विचारों के पदानुक्रम के संबंध में भी पूरी तरह से अज्ञेयवादी है।

हैप्पी हैकिंग!


यह समाधान ज्यादातर काम करता है। डिवाइस घुमाने पर, हालांकि, झूले से पहले टिंट्स वापस उसी तरह से जाते हैं जैसे वे थे।
धीरज गुप्ता

धीरज, मैंने आपके निष्कर्षों का पता लगाने के लिए एक प्रोजेक्ट सेटअप में इसे फिर से स्पष्ट रूप से परीक्षण किया है, और मैं नहीं मानता हूं। टिंट उस तरह से वापस नहीं जाता है जिस तरह से यह घुमाने पर था।
ओबीडान

एक्सकोड 6.4, और एक्सकोड 7.0 पर सत्यापित कार्यात्मक। 8.X और 9.0 के सभी रूपों के सिमुलेटर चलाना। यदि अनुरोध किया गया है, तो मैं इस परियोजना को जीथब पर रखूंगा।
ओबीडान

वैसे आप आगे बढ़ सकते हैं और एक परियोजना रख सकते हैं, लेकिन यह वही है जो मुझे हो रहा था। यह iPad पर भी काम नहीं कर रहा था। हालाँकि, आपके तरीके के आधार पर स्विज़लिंग का विचार, हालांकि, मैं इसे देखने के लिए काम करने में सक्षम था
धीरज गुप्ता

यदि आप कोई प्रोजेक्ट लगाते हैं, तो मैं viewDidLayoutSubviews स्विज़ल के साथ एक पुल अनुरोध प्रस्तुत कर सकता हूं, जो कि मैंने अभी-अभी अपने ऐप के नवीनतम बिल्ड में ऐप स्टोर में उपयोग किया है और प्रस्तुत किया है, हो सकता है कि आप एक नज़र डालें?
धीरज गुप्ता

3

कृपया इस श्रेणी को खोजें। मैं UIAlertAction और UIAlertController के फॉंट और कलर को बदलने में सक्षम हूं।

उपयोग:

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

5
कृपया, यहां कोड पेस्ट करें या एक ऐसी सेवा का उपयोग करें जिसमें लोगों को लॉग इन करने की आवश्यकता नहीं है।
सुल्तान

3

स्विफ्ट 4.1 और एक्सकोड 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)
यश बेदी

@ यश बेदी, धन्यवाद, मैंने अपना जवाब अपडेट कर दिया, कृपया इसे एक बार देखें।
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");
    }];

मैंने यह कोशिश की। ध्यान दें कि अलर्ट कंट्रोलर प्रस्तुत करने के बाद आप विंडो टिंट सेटिंग को फिर से खोल रहे हैं। मुझे चेतावनी नियंत्रक पर रंग वापस सही दिखाई दे रहा है। मेरा मानना ​​है कि किसी भी कार्रवाई के टैप होने के बाद रिवर्ट किया जाना चाहिए।
जर्मन

धन्यवाद @ जर्मन कि बाहर इशारा करने के लिए .. कोड में परिवर्तन किए। मैं अब तक AlertAction में रिवर्ट को संभाल रहा हूं .. लेकिन हां मैं मानता हूं कि इसे डिमिस हैंडलर में भी संभाला जा सकता है
अखिलेश शर्मा

1

मैं अर्बन आउटफिटर्स के लिए काम करता हूं। हमारे पास एक ओपन सोर्स पॉड है, URBNAlertजिसका उपयोग हमने अपने सभी ऐप में किया है। यह बंद आधारित है UIAlertController, लेकिन अत्यधिक अनुकूलन योग्य है।

स्रोत यहां है: https://github.com/urbn/URBNAlert

या बस URBNAlertअपने पॉडफाइल में रखकर पॉड द्वारा स्थापित करें

कुछ नमूना कोड:

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

क्या यह एक्शनशीट शैली का समर्थन करता है?
दिनपे

@ यह नहीं है, यह विशुद्ध रूप से सिर्फ अलर्ट के लिए है .. यह कहा जा रहा है .. अगर इसकी कुछ आप रेपो पर एक मुद्दा बनाना चाहते हैं। यह एक ऐसी चीज है जिसके बारे में हमने पहले भी समर्थन की चर्चा की है
रयान

1

CANCEL जैसे एक बटन के रंग को लाल रंग में बदलने के लिए आप इस शैली की संपत्ति का उपयोग कर सकते हैं जिसे 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

स्विफ्ट 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];

यह पृष्ठभूमि के रंग के लिए काम करता है, लेकिन यह रंग रंग कभी नहीं बदलता है यह वही है जो मैं थोड़ा उलझन में हूं
अखिलेश शर्मा

0

मैंने एक विधि वस्तुनिष्ठ-सी बनाई है

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

मैं बस इस तरह की मांग का उपयोग करता हूं, प्रतीत होता है और सिस्टम, विवरण थोड़ा अलग हैं, इसलिए हम हैं ... ओसी को अलर्ट और शीट पॉपअप विंडो एनकैप्सुलेशन का एहसास हुआ।

अक्सर दैनिक विकास में सामना करना पड़ता है, अलर्ट में एक आंकड़ा जोड़ने या बटन का रंग बदलने की आवश्यकता होती है, जैसे कि "सरल" मांग, आज अत्यधिक के समान और सिस्टम घटकों को लाता है और पूरी तरह से अनुकूलित पैकेजिंग घटकों की मांग को पूरा कर सकता है।

जीथब: https://github.com/ReverseScale/RSCustomAlertView

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.