带有 NSAttributedString(s) 的简单 UIAlertView

Posted

技术标签:

【中文标题】带有 NSAttributedString(s) 的简单 UIAlertView【英文标题】:Simple UIAlertView with NSAttributedString(s) 【发布时间】:2015-05-09 04:48:38 【问题描述】:

我正在寻找一种简单的方法来使用 NSAttributedString 和一个非常简单的消息框,类似于:

NSString *new_item = [NSString stringWithFormat:@"<span style=\"font-family: Helvetica Neue; font-size: 12.0\">%@</span>", @"MOTD html String downloaded from website"];
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[new_item dataUsingEncoding:NSUnicodeStringEncoding] options:@ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType  documentAttributes:nil error:nil];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"MOTD"
                                                   message:attrStr
                                                  delegate:nil
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:nil];
[alert show];

我上面的代码采用从服务器下载的 HTML 格式的字符串,确保文本大小适合屏幕,然后尝试将NSAttributedString 发送到UIAlertView。但是UIAlertView 不喜欢这样。解决这个问题的最简单方法是什么?(非 HTML 格式的 MOTD 不是一个选项)

【问题讨论】:

UIAlertViewUIAlertController 都不能使用属性字符串。要么找到第三方替代品,要么自己编写。 关于使用什么 3rd 方库有什么建议吗?我正在寻找可可控件,但所有这些控件似乎都比我正在寻找的复杂得多 猜猜最好的方法是创建我自己的,这里的好例子:***.com/questions/19118919/… 【参考方案1】:

将您的属性字符串添加到标签并将其作为评估视图添加到警报

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Test Attributed String" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:@"Hello red"];
[attributedStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
lbl.attributedText = attributedStr;
lbl.textAlignment = NSTextAlignmentCenter;
[alert setValue:lbl forKey:@"accessoryView"];
[alert show];

现在 UIAlertView 已弃用。你可以使用UIAlertController

【讨论】:

这实现了我想要做的,可能需要担心长消息的大小。谢谢! @AshishKakkad,TY 为您解答——我找到了改进其 UI 的方法。为您 +1,并从我这边对 SO 做出一些贡献。 [P.S. added my own answer] @NiibFouda 欢迎。但请使用UIAlertController @AshishKakkad 我无法在 UIAlertController 中使用“accessoryView” 我需要在警报中添加可点击的超链接【参考方案2】:

我从@AshishKakkad 的回答中得到了一个想法(+1)。但是,它的 UI 无法正确显示。因此,我向您展示了一种使用 attributedString 格式化您的消息的方法。

这是我的做法:

NSMutableString *message = [NSMutableString string];
NSString *title = @"Message Heading";
[message appendString:title];
[message appendString:@"\n\n• Topic 1"];
[message appendString:@"\n• Topic 2"];
[message appendString:@"\n• Topic 3\n"]; //Important, I have added '\n' at last to have some extra space at bottom.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"" delegate:self cancelButtonTitle:@"CancelButton" otherButtonTitles:@"OtherButton", nil];
//need to set a label as `accessoryView` of an alert.
[alert setValue:[self getLabelWithMessage:message withTitle:title] forKey:@"accessoryView"];
[alert show];

- (UILabel *)getLabelWithMessage:(NSMutableString *)message withTitle:(NSString *)title 
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setAlignment:NSTextAlignmentLeft];
    paragraphStyle.paragraphSpacing = 2.0f;
    paragraphStyle.headIndent = 20.0;
    paragraphStyle.firstLineHeadIndent = 20.0;
    paragraphStyle.tailIndent = -20.0;

    NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:message];
    [attribString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [message length])];
    [attribString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12.f] range:NSMakeRange(0, [message length])];
    [attribString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:12.f] range:NSMakeRange(0, [title length])];

    UILabel *label = [[UILabel alloc] init];
    [label setAttributedText:attribString];
    [label setNumberOfLines:0];
    [label sizeToFit];
    return label;

【讨论】:

【参考方案3】:

别忘了设置:

lbl.numberOfLines = 0;

当你有多行时

【讨论】:

【参考方案4】:

作为私有 API 的替代方案,您可以使用 https://github.com/AntonPoltoratskyi/NativeUI

pod 'NativeUI/Alert', '~&gt; 1.0'

它看起来和原生警报一模一样,但足够可配置。

更多详情请查看https://***.com/a/61047809/6726766。

【讨论】:

以上是关于带有 NSAttributedString(s) 的简单 UIAlertView的主要内容,如果未能解决你的问题,请参考以下文章

显示带有不间断空格和多行的 NSAttributedString 的 Swift 错误

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName

Swift - 带有链接的 HTML 风格化 NSAttributedString

带有 NSAttributedString 和 NSTextAttachment 的 UITextView。如何显示文字?

NSAttributedString使用方法整理

利用NSAttributedString实现图文混排