将收件人显示为 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 或者实际上将其子类化来创建您自己的更容易管理。

如果你不介意使用外部库,在我的一个项目中我使用这个podCLTokenInputView。真的很容易使用,节省了我自己实现的时间。快速版本是here。

然后只需遵循CLTokenInputViewDelegate 中的协议并在以下代码中实现您的代码:

func tokenInputView(aView:CLTokenInputView, didAddToken token:CLToken)

func tokenInputView(aView:CLTokenInputView, didRemoveToken token:CLToken)

【讨论】:

【参考方案4】:

你可以用这个。你见过https://github.com/venmo/VENTokenField 吗?

【讨论】:

以上是关于将收件人显示为 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

如何将(id)发件人添加到以下-(IBAction)?

UIButton 点击​​发件人总是转到选定的选项

使用发件人标签在 UIbutton 单击事件时更新 UITableViewCell 的标签

浮动操作按钮的中心 UIButton 文本,如收件箱应用程序

在发件人中使用带有 UIButton 的标签属性并尝试强制转换 id -> UIButton

我用的是foxmail邮箱,可以发送邮件给别人,收到别人发来的邮件,但是别人发不了给我,显示为无效收件人