将收件人显示为 UIButton
Posted
技术标签:
【中文标题】将收件人显示为 UIButton【英文标题】:Show recipient as UIButton 【发布时间】:2016-08-01 12:32:59 【问题描述】:类似于iPhone
邮件,我想将收件人显示为UIButton
。但我无法正确实施。
我在单个 UILabel 上创建所有收件人,然后为其分配属性文本。
NSMutableArray *arrRecipients = [NSMutableArray new];
if([message.Recipients containsString:@", "])
NSArray *arr = [message.Recipients componentsSeparatedByString:@", "];
for(int i = 0; i < arr.count; i++)
[arrRecipients addObject:[arr objectAtIndex:i]];
else
[arrRecipients addObject:message.Recipients];
NSString *recipientString = @"";
for(int i = 0; i < arrRecipients.count; i++)
if([recipientString isEqual:@""])
recipientString = [arrRecipients objectAtIndex:i];
else
recipientString = [recipientString stringByAppendingString:[NSString stringWithFormat:@" %@", [arrRecipients objectAtIndex:i]]];
NSMutableAttributedString *str = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"to", nil), recipientString]];
for(NSString *value in arrRecipients)
NSRange range = [recipientString rangeOfString:value];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor colorWithRed:205.0/255.0 green:205.0/255.0 blue:205.0/255.0 alpha:1.0] range:NSMakeRange(range.location + 4, range.length)];
UILabel *recipients = [[UILabel alloc]initWithFrame:CGRectMake(5, subject.frame.origin.y + subject.frame.size.height + 6, viewHeader.frame.size.width - 5, 20)];
recipients.attributedText = str;
recipients.numberOfLines = 0;
recipients.font = [UIFont systemFontOfSize:14];
[viewHeader addSubview:recipients];
[recipients sizeToFit];
[viewHeader sizeToFit];
结果:
不是一个很好的。
我该如何改进它?
【问题讨论】:
作为“UIButton”,具有什么样的自定义/外观?否则,您可能想使用NSLinkAttributeName
?
您也可以使用UICollectionView
或使用TURecipientBar from github。
看看这个cocoacontrols.com/controls/jstokenfield
【参考方案1】:
您应该使用 UITextView
和属性字符串键 NSLinkAttributeName
并使用各自的 UITextView
代表处理每个名称的点击。
NSMutableAttributedString *str = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"to", nil), recipientString]];
for(NSString *value in arrRecipients)
NSRange range = [recipientString rangeOfString:value];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor colorWithRed:205.0/255.0 green:205.0/255.0 blue:205.0/255.0 alpha:1.0] range:NSMakeRange(range.location + 4, range.length)];
[str addAttribute: NSLinkAttributeName value:"a custom url scheme" range:NSMakeRange(range.location + 4, range.length)];
然后在这个方法中处理:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
if ([[URL scheme] isEqualToString:@"myurl"])
// Handle tap
return NO;
return YES;
【讨论】:
不要忘记将 textView 的“editable”属性设置为 NO,将“selectable”属性设置为 YES,以便名称可点击。 这个实现的问题是,当链接扩展到两行时,链接文本之间没有间隙。与我在问题中所附的内容非常相似。【参考方案2】:就像在邮件或其他应用程序中一样,我们可以使用标签功能来区分项目列表。 以下链接可能会帮助您: https://www.cocoacontrols.com/search?q=tags https://www.cocoacontrols.com/controls/aktagsinputview
【讨论】:
【参考方案3】:就像@Mohamad Sheikh 建议的那样,在我看来,您可以使用带有属性字符串的 UITextView 或者实际上将其子类化来创建您自己的更容易管理。
如果你不介意使用外部库,在我的一个项目中我使用这个pod
CLTokenInputView。真的很容易使用,节省了我自己实现的时间。快速版本是here。
然后只需遵循CLTokenInputViewDelegate
中的协议并在以下代码中实现您的代码:
func tokenInputView(aView:CLTokenInputView, didAddToken token:CLToken)
func tokenInputView(aView:CLTokenInputView, didRemoveToken token:CLToken)
【讨论】:
【参考方案4】:你可以用这个。你见过https://github.com/venmo/VENTokenField 吗?
【讨论】:
以上是关于将收件人显示为 UIButton的主要内容,如果未能解决你的问题,请参考以下文章
使用发件人标签在 UIbutton 单击事件时更新 UITableViewCell 的标签
浮动操作按钮的中心 UIButton 文本,如收件箱应用程序