2013-06-16 1 views
6

돌렸다.는 동적 내 옵션은 다음을 수행하기위한 무엇인지 확실하지 않다 텍스트

NSAttributedString을 사용해야하고 동적 색인과 길이를 사용하여 특성을 적용해야합니까?

또는 대시 이전에 각 단어를 고유 한 레이블로 만들 수 있습니까? (여러 라벨을 인라인으로 배치하고 크기를 늘릴 때 나머지를 오른쪽으로 밀면 HTML/CSS에서 플로팅이 어떻게 작동하는지 알 수 없습니다.)

+0

현재 앱에서 정확히 이것을하고 있는데, 하나의 NSMutableAttributedString을 사용하고 강조 속성을 추가하고 있습니다. 이 접근법에서 알아 낸 유일한 단점은 라벨 텍스트가 현지화 될 수 있기 때문에 속성을 추가하는 범위를 정확히 계산하는 것이 성가시다는 것입니다. – Greg

답변

21

가장 좋은 옵션은 다음과 같습니다. 다른 옵션이기 때문에, 하나 개의 레이블에서 하나의 NSAttributedString이 작업을 수행 :

  1. 를 사용하여 여러 레이블, 주위로 이동, 자신의 프레임 무언가가 변화 할 때마다 변경 정확히 공간이 있어야한다 너비를 알아낼 수 있도록 화면이나보기에 너무 넓지는 않은지 확인하십시오. 보시다시피 매우 빠르게 고통 스럽습니다.

  2. 위로 이동하고 단일 레이블을 표시하는 것이 분명히 과장되어있는 UIWebView을 사용하십시오. 스크롤링, 확대/축소, JavaScript 및 기타 모든 것들을 필요로하지 않기 때문에 이러한 모든 놀라운 것들을 제공합니다. 기능은 사용 여부에 상관없이 CPU 사이클을 사용하므로 성능이 매우 좋지 않습니다. 특히 많은 수의 테이블을 보유해야하는 경우 (예 : 테이블의 모든 셀에서) 보기)

단일 문자열을 사용하는 경우 반면에, 올바르게 속성에 대한 범위를 계산됩니다 할 일은,에 속성 문자열을 할당 210의 attributedText (참고, iOS 6+ 만 해당하지만 문제의 태그로 판단하면 문제가되지 않음) 완료하면 완료됩니다. 나는 현재이 방법을 내 앱 전반에 걸쳐 광범위하게 사용하고 있으며 잠시 동안 잘 작동하고있다. ( 다른 두 가지를 시도해보기 전에이 두 가지를 시도해보기 바란다. 경우 예상대로이 예를 들어, 작동하지 않습니다

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 50)]; 
label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0]; 
[self.view addSubview:label]; 

NSString *category = @"Socks"; 
NSString *store = @"Apple Store"; 

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] 
             initWithString:[NSString stringWithFormat: 
             @"in %@ at %@ — 1 day ago", 
              category, store]]; 

[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:[string.string rangeOfString:category]]; 
[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:[string.string rangeOfString:store]]; 

label.attributedText = string; 
, storecategory의 값은 다음과 같습니다

은 여기에 기인 문자열을 사용하여이 일을 매우 기본적인 예입니다 same, rangeOfString:이 주어진 문자열의 첫 번째 항목을 찾습니다. 즉 범주 문자열이 두 번 강조 표시 될 수 있고 저장소 문자열이 전혀 표시되지 않을 수 있습니다.

더 나은 예 :

NSString *in = @"in "; 
NSString *category = @"in"; 
NSString *at = @" at "; 
NSString *store = @"in"; 

NSString *text = [NSString stringWithFormat:@"%@%@%@%@ — 1 day ago", 
              in, category, at, store]; 
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] 
             initWithString:text]; 

[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:NSMakeRange(in.length, category.length)]; 
[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:NSMakeRange(in.length + category.length + at.length, 
           store.length)]; 

: 여기에 수동으로 범위를 계산해야하는 추가 두통으로 인해 동일한 문자열의 휴식이라도하지 않습니다 약간 더 고급 예제 이 방법은 항상이 올바로 작동합니다. 문자열이 모두 같더라도 강조 표시 할 범위를 수동으로 계산해야하기 때문에 코드 방식이 약간 길어집니다 (실제로는 그렇지 않습니다). 중요한 문제 또는 절대적으로 많은 코드).

UPDATE :

[string addAttribute:NSFontAttributeName 
       value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0] 
       range:NSMakeRange(in.length, category.length)]; 
[string addAttribute:NSFontAttributeName 
       value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0] 
       range:NSMakeRange(in.length + category.length + at.length, 
           store.length)]; 

더 속성에 대한 NSAttributedStringUIKit Additions Reference에서보세요 : 당신이 그것을보고하지 않아도 그냥 굵은 글꼴을 사용하는 간단한 예제를 추가 원하는 효과를 얻기 위해 문자열에 추가 할 수 있습니다.

+1

감사의 말로 모든 가능성을 설명해 주셔서 감사합니다. 최고의 솔루션. –

+0

+1 멋지고 자세한 답변을 위해! – Paaske

관련 문제