Показать получателя как UIButton
Как и почта 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];
Результаты:
![введите описание изображения здесь]()
Не совсем хороший.
Как я могу улучшить его?
Ответы
Ответ 1
Как и в почте или в других приложениях, мы можем иметь функциональность тегов, которые могут различать список элементов.
Ниже ссылки могут помочь вам:
https://www.cocoacontrols.com/search?q=tags
https://www.cocoacontrols.com/controls/aktagsinputview
Ответ 2
Вы должны использовать 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;
}
Ответ 3
Как и то, что предложил @Mohamad Sheikh, вы могли бы использовать UITextView с атрибутной строкой или фактически подклассом, чтобы создать свой собственный, проще управлять, на мой взгляд.
Если вы не против использования внешней библиотеки, в одном из моих проектов я использую этот pod
CLTokenInputView. Действительно прост в использовании и экономит мне часы на реализацию моих собственных. Быстрая версия здесь.
Затем просто следуйте протоколу в CLTokenInputViewDelegate
и реализуйте свой код следующим образом:
func tokenInputView(aView:CLTokenInputView, didAddToken token:CLToken)
func tokenInputView(aView:CLTokenInputView, didRemoveToken token:CLToken)
Ответ 4
Вы можете использовать этот. Вы видели https://github.com/venmo/VENTokenField?