UIAlertController выравнивание текста
Есть ли способ изменить выравнивание сообщения, отображаемого внутри UIAlertController на iOS 8?
Я считаю, что получить доступ к подпредставлениям и изменить их для UILabel больше невозможно.
6 ответов
Я успешно использовал следующее для выравнивания и стилизации текста UIAlertControllers:
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.Left
let messageText = NSMutableAttributedString(
string: "The message you want to display",
attributes: [
NSParagraphStyleAttributeName: paragraphStyle,
NSFontAttributeName : UIFont.preferredFontForTextStyle(UIFontTextStyleBody),
NSForegroundColorAttributeName : UIColor.blackColor()
]
)
myAlert.setValue(messageText, forKey: "attributedMessage")
Вы можете сделать то же самое с заголовком, если вы используете "attributedTitle"
, вместо "attributedMessage"
Swift 3 обновление
Выше все еще работает в Swift 3, но код должен быть немного изменен к этому:
let messageText = NSMutableAttributedString(
string: "The message you want to display",
attributes: [
NSParagraphStyleAttributeName: paragraphStyle,
NSFontAttributeName : UIFont.preferredFont(forTextStyle: UIFontTextStyle.body),
NSForegroundColorAttributeName : UIColor.black
]
)
myAlert.setValue(messageText, forKey: "attributedMessage")
Swift 4 обновление
let messageText = NSMutableAttributedString(
string: "The message you want to display",
attributes: [
NSAttributedStringKey.paragraphStyle: paragraphStyle,
NSAttributedStringKey.font: UIFont.preferredFont(forTextStyle: UIFontTextStyle.body),
NSAttributedStringKey.foregroundColor: UIColor.black
]
)
myAlert.setValue(messageText, forKey: "attributedMessage")
Используйте код ниже
UIAlertController * alert = [UIAlertController
alertControllerWithTitle:[title lowercaseString]
message:[message lowercaseString]
preferredStyle:UIAlertControllerStyleAlert];
if (alertStyle == kUIAlertStylePlainText)
{
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
}];
}
if (okTitle) {
UIAlertAction* ok = [UIAlertAction actionWithTitle:[okTitle lowercaseString] style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
callback(alert, action, nil);
}];
[alert addAction:ok];
}
if (cancelTitle) {
UIAlertAction* cancel = [UIAlertAction actionWithTitle:[cancelTitle lowercaseString] style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
callback(alert, nil, action);
}];
[alert addAction:cancel];
}
NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
paraStyle.alignment = NSTextAlignmentLeft;
NSMutableAttributedString *atrStr = [[NSMutableAttributedString alloc] initWithString:[message lowercaseString] attributes:@{NSParagraphStyleAttributeName:paraStyle,NSFontAttributeName:[UIFont systemFontOfSize:13.0]}];
[alert setValue:atrStr forKey:@"attributedMessage"];
[viewInstance presentViewController:alert animated:YES completion:nil];
Я взял ответ Amos и превратил его в удобное расширение:
public extension UIAlertController {
func setMessageAlignment(_ alignment : NSTextAlignment) {
let paragraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.alignment = alignment
let messageText = NSMutableAttributedString(
string: self.message ?? "",
attributes: [
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 12),
NSAttributedString.Key.foregroundColor: UIColor.gray
]
)
self.setValue(messageText, forKey: "attributedMessage")
}
}
Тогда вы можете просто установить значение выравнивания: myAlert.setMessageAlignment(.left)
Перейдите к дереву подпредставлений, пока не дойдете до UILabels для заголовка и сообщения
NSArray *viewArray = [[[[[[[[[[[[alertController view] subviews] firstObject] subviews] firstObject] subviews] firstObject] subviews] firstObject] subviews] firstObject] subviews];
UILabel *alertTitle = viewArray[0]
UILabel *alertMessage = viewArray[1];
alertMessage.textAlignment = NSTextAlignmentLeft;
Тем не менее, вы можете сделать категорию для него
@interface UIAlertController (ShowMeTheLabels)
@property (nonatomic, strong) UILabel *titleLabel, *messageLabel;
@end
@implementation UIAlertController (ShowMeTheLabels)
@dynamic titleLabel;
@dynamic messageLabel;
- (NSArray *)viewArray:(UIView *)root {
NSLog(@"%@", root.subviews);
static NSArray *_subviews = nil;
_subviews = nil;
for (UIView *v in root.subviews) {
if (_subviews) {
break;
}
if ([v isKindOfClass:[UILabel class]]) {
_subviews = root.subviews;
return _subviews;
}
[self viewArray:v];
}
return _subviews;
}
- (UILabel *)titleLabel {
return [self viewArray:self.view][0];
}
- (UILabel *)messageLabel {
return [self viewArray:self.view][1];
}
@end
Затем вы можете выровнять текст следующим образом
yourAlertController.messageLabel.textAlignment = NSTextAlignmentLeft;
Swift 4.2 + многострочный отступ строки
let paragraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.headIndent = 14
let messageText = NSMutableAttributedString(
string: "... multiline string need linebreak indentation ...",
attributes: [
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 12),
NSAttributedString.Key.foregroundColor: UIColor.gray
]
)
alert.setValue(messageText, forKey: "attributedMessage")
Следующий метод устанавливает выравнивание текста, сохраняя размер шрифта по умолчанию.
static void makeAlertControllerLeftAligned( UIAlertController* avc )
{
NSMutableParagraphStyle *paraStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
paraStyle.alignment = NSTextAlignmentLeft;
NSMutableAttributedString *atrStr =
[[[NSMutableAttributedString alloc] initWithString:avc.message attributes:@{
NSParagraphStyleAttributeName:paraStyle,
NSFontAttributeName: [UIFont preferredFontForTextStyle: UIFontTextStyleFootnote],
}]
autorelease];
[avc setValue:atrStr forKey:@"attributedMessage"];
}
yourAlertController.messageLabel.textAlignment = NSTextAlignmentLeft;
Это свойство предоставляет текстовые поля, поэтому, вероятно, может быть использовано для их настройки:
TextFields
Массив текстовых полей, отображаемых предупреждением. (Только для чтения)
декларация
СВИФТ
var textFields: [AnyObject]? { get }
Objective-C
@property(nonatomic, readonly) NSArray *textFields
обсуждение
Используйте это свойство для доступа к текстовым полям, отображаемым в предупреждении. Текстовые поля расположены в том порядке, в котором вы добавили их в контроллер предупреждений. Этот порядок также соответствует порядку, в котором они отображаются в предупреждении.
Примечание: несмотря на то, что это свойство readonly
, он возвращает массив ссылок на объекты текстового поля, которые можно использовать для изменения элементов управления.