2016-08-01 31 views
11

Podobny do iPhone mail, chcę wyświetlić odbiorców jako UIButton. Ale nie jestem w stanie go poprawnie wdrożyć.
Tworzę wszystkich odbiorców za pomocą jednego UILabel, a następnie przypisuję do niego przypisany tekst.Pokaż odbiorcę jako UIButton

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]; 

Wyniki:

enter image description here

nie jest to całkiem dobry.

Jak mogę to poprawić?

+0

Jako "Uibutton", z jakiego rodzaju dostosowaniem/wyglądem? W przeciwnym razie możesz użyć 'NSLinkAttributeName'? – Larme

+0

Możesz także osiągnąć to samo używając 'UICollectionView' lub możesz użyć [TURecipientBar z github] (https://github.com/davbeck/TURecipientBar). –

+0

Spójrz na to https://www.cocoacontrols.com/controls/jstokenfield – iPatel

Odpowiedz

5

Powinieneś użyć UITextView z przypisanym kluczem strunowym NSLinkAttributeName i dotknij dotknięcia każdej nazwy z odpowiednim delegatem 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)]; 

} 

Następnie obsłużyć w tej metodzie:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange 
{ 
    if ([[URL scheme] isEqualToString:@"myurl"]) { 
     // Handle tap 

     return NO; 
    } 

    return YES; 
} 
+1

Nie zapomnij ustawić "edytowalnej" właściwości textView na NIE, a "wybierz" na TAK, aby nazwa mogła być klikalna. – utogaria

+0

Problem z tą implementacją polega na tym, że gdy łącze rozciąga się na dwa wiersze, nie ma przerwy pomiędzy połączonym tekstem. Bardzo podobne do tego, co dołączyłem do mojego pytania. – Nitish

3

Jak co sugeruje @Mohamad Sheikh, można użyć UITextView z przypisywanego sznurka lub rzeczywiście podklasy go do tworzenia własnych jest łatwiejsze do zarządzania moim zdaniem.

Jeśli nie masz nic przeciwko używaniu biblioteki zewnętrznej, w jednym z moich projektów używam tego podCLTokenInputView. Jest naprawdę łatwy w użyciu i pozwala mi zaoszczędzić wiele godzin na wdrażanie własnych. Wersja szybka to here.

Następnie wystarczy postępować zgodnie z protokołem w CLTokenInputViewDelegate i wdrożyć swój kod w następujących przypadkach:

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

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