Previously all the dialog and textField are working well. But not I do not know how these TextFields are suddenly changed to single line with triple. (Like some Message here...)
let alert = UIAlertController(title: "Cancel Booking !!", message: "Are you sure you want to cancel your booking?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "No", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Yes", style: .default, handler: self.cancelMessageDialog))
self.present(alert, animated: true, completion: nil)
I had the same problem and solved it after 3 days and nights. Since the UIAlertViewController uses UILabel to show the message, I was firmly searching all over the project for something modifying the UILabel. I realized that no search result includes anything from some pods that definitely has "label" keywords in their function names and such. I decided to download the source codes for all of the pods from their repositories and searched recursively inside them with another simple text editor and voila! Some guy decided to override the default UILabel class instead of subclassing it in their pod. The culprit lines were
extension UILabel {
...
override open func draw(_ rect: CGRect) { ... }
override open var intrinsicContentSize: CGSize { ... }
...
}
These did not show up in the search results by using the search function in XCode as I searched for UILabel extensions to begin with. So, I recommend you to open any 3rd party framework's source codes in your project and search inside them separately. There is most definitely something messing with the UILabel class.
Add line break characters (\n) to your message.
You should use attributedMessage
String with setValue
method of UIAlertController
here just as follows :
let attributedString = NSAttributedString(string: "My long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long textMy long text",
attributes: [NSAttributedStringKey.font : UIFont(name: "Avenir-Light", size: 20)!])
let alert = UIAlertController(title: "Title", message: "", preferredStyle: .alert)
alert.setValue(attributedString, forKey: "attributedMessage")
let yesAction = UIAlertAction(title: "Yes", style: .default) { (action) in
}
let noAction = UIAlertAction(title: "No", style: .cancel) { (action) in
}
alert.addAction(noAction)
alert.addAction(yesAction)
present(alert, animated: true, completion: nil)
Solved Finally
I solved this problem by making the custom UILable inside the UIViewController. This may not be the good practice, so kindly let me know if someone find the better solution then this.
func showTestAlert(message:String , viewController:UIViewController){
let customUiLableView:UILabel
let alert:UIAlertController
if((message.count) < 100){
alert = UIAlertController(title: "", message: "\n\n\n\n", preferredStyle: .alert)
customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 120))
customUiLableView.numberOfLines = 4
}else if((message.count) < 200){
alert = UIAlertController(title: "", message: "\n\n\n\n\n\n", preferredStyle: .alert)
customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 160))
customUiLableView.numberOfLines = 6
}else{
alert = UIAlertController(title: "", message: "\n\n\n\n\n\n\n\n", preferredStyle: .alert)
customUiLableView = UILabel(frame: CGRect(x: 10, y: 0, width: 250, height: 200))
customUiLableView.numberOfLines = 8
}
customUiLableView.text = message
customUiLableView.textAlignment = .center
customUiLableView.textColor = UIColor.darkGray
customUiLableView.font = UIFont(name: "Helvetica", size: 16.0)
let action = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.view.addSubview(customUiLableView)
alert.addAction(action)
viewController.present(alert, animated: true, completion: nil)
}
You have to set numberOfLines
property of UILabel
, because default value is 1 (single line) & and value of 0 means no limit, if the height of the text reaches the numberOfLines of lines or the height of the view is less than the numberOfLines of lines allowed, the text will be truncated using the line break mode.
if #available(iOS 9.0, *) {
UILabel.appearance(whenContainedInInstancesOf: [UIAlertController.self]).numberOfLines = 0
} else {
// Fallback on earlier versions
}