2017-04-24 3 views
1

I이 경우 반드시 정사각형 UILabel에 맞게 바로 그 이유 때문에 나는의 양을 계산하는 데 필요하지 않을 수도 UILabel 간다 텍스트의 정사각형 필요가있는 UILabel 텍스트는 UILabel의 프레임에 맞을 것입니다. 내가 문자열의 인덱스를 얻기 위해이 코드 조각을 사용하고, 문자열은 UILabel의에 딱 맞는있는 -계산 문자열

CGFloat labelWidth  = self.textLabel.frame.size.width; 
CGFloat labelHeight = self.textLabel.frame.size.height - titleRect.size.height - 16.0; 
CGSize sizeConstraint = CGSizeMake(labelWidth, CGFLOAT_MAX); 

NSDictionary *attributes = @{ NSFontAttributeName : font}; 

CGRect boundingRect = [body boundingRectWithSize:sizeConstraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]; 
if (boundingRect.size.height > labelHeight) 
{ 
    NSUInteger stringIndex = 0; 
    NSUInteger prev; 
    NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
    do 
    { 
     prev = stringIndex; 
     if (mode == NSLineBreakByCharWrapping) 
      stringIndex++; 
     else 
      stringIndex = [body rangeOfCharacterFromSet:characterSet options:0 range:NSMakeRange(stringIndex + 1, [body length] - stringIndex - 1)].location; 
    } 

    while (stringIndex != NSNotFound && stringIndex < [body length] && [[body substringToIndex:stringIndex] boundingRectWithSize:sizeConstraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil].size.height <= labelHeight); 

    return prev; 
} 

나는이 인덱스를 사용하여 얻을 하위 문자열이 너무 크고의 프레임 밖으로 이동 the UILabel

내가 잘못하고있는 것은 무엇입니까?

편집

나는 @rmaddy에 의해 제안 NSLineBreakByTruncatingTail을 사용하려고하지만 UIScrollView 내부에있는 UILabel는 프레임의에 충실하기를 거부한다.

self.textLabel.lineBreakMode = NSLineBreakByTruncatingTail; 
self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, self.textLabel.frame.origin.y, self.textLabel.frame.size.width, self.textLabel.frame.size.width); 
[self setText:self.titleText andBody:self.bodyText andFontName:fontname andSize:size andColor:self.color]; 

나는 그것의 높이를 조정하고있는 UILabel의 텍스트를 설정하는 상상 - 여기에 코드입니다. 프레임을 설정하기 전에 텍스트 설정을 시도했지만 작동하지 않습니다. 나는 이것에 너무 오래 머물렀다.

+2

왜 문제로 이동합니다. 라벨의'lineBreakMode'를'NSLineBreakByTruncatingTail'으로 설정하면됩니다. – rmaddy

+0

@rmaddy는 내 마음에 결코 오지 않았습니다. 그것을 시도하고 내 요구를 충족하는지 확인하자 – genaks

+0

@rmaddy textLabel의 텍스트를 기록하면 무엇을 얻을 수 있습니까? 전체 문자열 또는 잘린 문자열? 나는 또한 절단 된 문자열이 필요하기 때문에 이것을 묻습니다. – genaks

답변

0

문자열의 길이를 확인하고 레이블 너비에 맞게 조정할 수 있습니다. 이 같은

뭔가 :

CGSize sizeOfText = [self.label.text boundingRectWithSize: CGSizeMake(self.label.intrinsicContentSize.width, CGFLOAT_MAX) 
              options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
              attributes: [NSDictionary dictionaryWithObject:self.label.font forKey:NSFontAttributeName] context: nil].size; 

if (self.label.intrinsicContentSize.height < ceilf(sizeOfText.height)) { 
// label is truncated 
// so do something here 
}else{ 
// in here do something else 
}