2013년 4월 13일 토요일

label의 matrix 와 text 정렬


iOS 7 이상에서는  boundingRectWithSize:options:attributes:context:
를 사용할 수 있음.
예제)
CGSize maximumLabelSize = CGSizeMake(_lyricsLabel.frame.size.width, CGFLOAT_MAX);
    
    CGRect expectSize = [_lyricsLabel.text boundingRectWithSize:maximumLabelSize
                                               options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                            attributes:@{NSFontAttributeName:_lyricsLabel.font}
                                               context:nil];
    _lyricsLabel.frame = CGRectMake(_lyricsLabel.frame.origin.x,
                                             _lyricsLabel.frame.origin.y,
                                             _lyricsLabel.frame.size.width,

                                             expectSize.size.height);



NSString의 sizeWithFont:constrainedToSize:lineBreakMode: 메써드를 통해서 text가 그려질 layout metrics를 받아올수 있다.

아래는 그 사용 예제이다:
- (void)alignSingleLineLabels
{
    [_label1 setText:@"첫번째 레이블."];
    [_label2 setText:@"두번째 레이블 입니다.!"];
   
    CGSize _label1_Size = [_label1.text sizeWithFont:_label1.font
                                              constrainedToSize:CGSizeMake(320, 640)
                                                  lineBreakMode:UILineBreakModeWordWrap];
    CGSize _label2_Size = [_label2.text sizeWithFont:_label2.font
                                   constrainedToSize:CGSizeMake(320, 640)
                                       lineBreakMode:UILineBreakModeWordWrap];
   
    [_label1 setFrame:CGRectMake(_label1.frame.origin.x, _label1.frame.origin.y, _label1_Size.width, _label1_Size.height)];
    float _label2_posX = _label1.frame.origin.x + _label1_Size.width;
    [_label2 setFrame:CGRectMake(_label2_posX, _label2.frame.origin.y, _label2_Size.width, _label2_Size.height)];
}

- (void)alignMultipleLineLabels
{
    [_label3 setText:@"첫번째 레이블.\n다은줄입니다."];
    [_label4 setText:@"두번째 레이블.\n다음줄 입니다.\n다은줄 입니다."];
    [_label5 setText:@"세번째 레이블.세번째 레이블.\n다음줄 입니다."];
   
    CGSize _label3_Size = [_label3.text sizeWithFont:_label3.font
                                   constrainedToSize:CGSizeMake(320, 640)
                                       lineBreakMode:UILineBreakModeWordWrap];
    CGSize _label4_Size = [_label4.text sizeWithFont:_label4.font
                                   constrainedToSize:CGSizeMake(320, 640)
                                       lineBreakMode:UILineBreakModeWordWrap];
    CGSize _label5_Size = [_label5.text sizeWithFont:_label5.font
                                   constrainedToSize:CGSizeMake(320, 640)
                                       lineBreakMode:UILineBreakModeWordWrap];
   
    [_label3 setFrame:CGRectMake(_label3.frame.origin.x, _label3.frame.origin.y, _label3_Size.width, _label3_Size.height)];
    float _label4_posX = _label3.frame.origin.x + _label3_Size.width;
    [_label4 setFrame:CGRectMake(_label4_posX, _label4.frame.origin.y, _label4_Size.width, _label4_Size.height)];
   
    float label5_posY = _label3_Size.height > _label4_Size.height?(_label3.frame.origin.y+_label3_Size.height):(_label4.frame.origin.y+_label4_Size.height);
    [_label5 setFrame:CGRectMake(_label5.frame.origin.x, label5_posY, _label5_Size.width, _label5_Size.height)];
}


레이블의 line 갯수를 가져와서 text가 그려질 line의 갯수와 비교하여 뉴라인문자(\n)을 리에블의 text에 append해줌으로써 text를 label의 맨 상단에 그려질 수 있도록 할 수있다.

- (void)alignTopLeft {
    CGSize labelSize = [_label6.text sizeWithFont:_label6.font
                                              constrainedToSize:CGSizeMake(_label6.frame.size.width, _label6.frame.size.height)
                                                  lineBreakMode:_label6.lineBreakMode];
    int lineCount = labelSize.height/_label6.font.lineHeight;
    int maxLineCount = _label6.numberOfLines;
    for (int i=lineCount; i < maxLineCount; i++) {
        _label6.text = [_label6.text stringByAppendingString:@"\n "];
    }
   
}


아래는단말에서 실행된 화면이다.

댓글 없음:

댓글 쓰기