2013-09-03 1 views
5

다양한 정적 텍스트 요소를 표시하는 iOS보기를 만들고 있습니다. XIB는 다음과 같습니다UILabelView에서이 수직 간격은 어디에서 오는가?

enter image description here

는 제목, 타임 스탬프, 본문 및 바닥 글에 대한 네 개의 레이블을 사용합니다. 모든 뷰는 수직 위의 형제 뷰에 고정되고 부모 뷰의 왼쪽/오른쪽에 고정됩니다. 모든 라벨은 높이가> = 인 본문과 줄 바꿈 스타일로 "단어 줄 바꿈"을 사용하여 줄 수를 0으로 설정 한 본문을 제외하고 고정 높이를 갖습니다. 부모 뷰는 UIScrollView입니다. 아이폰에

은 그것을 잘 다음과 같습니다

iPhone beginning of scroll iPhone end of scroll

을하지만 아이 패드는 다음과 같습니다

iPad beginning of scroll iPad end of scroll

허을? 본문 레이블의 추가 세로 공간이 어디에서 오는 것입니까? xib 및 해당보기 컨트롤러는 iPhone과 iPad간에 동일합니다 (현재 사용자 정의 iPad 코드 없음). 나는 수직 공간이 라벨이 얼마나 많은 줄 바꿈을하는지 직접적으로 관련이 있음을 발견했다. 줄 바꾸기가 없으면 추가 세로 공간이 없습니다. 몇 줄 밖에 감겨지지 않으면 약간의 수직 공간이 있습니다. 거의 모든 라인이 랩핑되면, 그게 그 모양입니다.

우선 UILabel이 이런 식으로 행동하는 이유에 대한 아이디어가 있습니까?

둘째로,이 작업을 중단 할 수 없다면 어떻게 해결할 수 있습니까?

저는 이미 몇 가지 시도를했습니다. -viewDidLayoutSubViews 내에서 [bodyLabel sizeToFit]을 호출하면 레이블을 수정하지만 형제보기의 레이아웃을 수정하지 않습니다 (예 : 바닥 글 레이블이 화면 맨 아래에 고정되어 있지 않은 채 고정되어 있음). 신체). sizeToFit를 호출 한 후 전체 뷰가 자식을 다시 레이아웃하도록하려는 모든 시도는 무시됩니다. 나는 또한 글꼴을 기반으로 높이를 계산하여 UILabel의 크기를 조정 해봤는데, 이는 -sizeToFit (더 많은 코드가 있지만)과 동일한 결과를 가져옵니다.

Body UILabel을 UITextView로 바꾸는 대신 이상한 세로 간격 문제가 발생하지 않지만 글꼴 계산을 사용하여 UITextView 높이를 수동으로 계산해야하며 부모 UIScrollView 내에서 UITextView의 크기를 조정하면됩니다. 따라서 UIScrollView는 스크롤하기를 거부합니다 (내용이 너무 크지는 않은 것처럼).

그래서 지금 막 붙어 있습니다. 심지어 에 대한 설명만으로도 UILabel이 iPad 레이아웃에서 이러한 방식으로 작동하면 도움이 될 것입니다.

+1

Autolayout 또는 스프링스 및 스트럿츠를 사용하고 있습니까? – CoderPug

+0

Autolayout을 사용하고 있습니다. 원하는 경우 제약 조건을 게시 할 수 있습니다. 나는 첫 단락에서 관련 제약 조건을 설명하려고 시도했다. – Brandon

+1

문제가 제약 사항이라고 생각하면, [bodyLabel sizeToFit]'바닥 글이 바닥에 붙어서 제약 조건을 확인해야한다면, 바닥 글에 바닥 글을 넣는 방법과 바닥을 만드는 방법이있을 것입니다. 바디 라벨이 수직으로 늘어납니다. – CoderPug

답변

3

주요 문제는 iPad에서 Label이 처음부터 너비가 설정되어 있지 않기 때문에 Label 내부의 텍스트 크기를 자동으로 조정하는 방법이 실패한 것입니다. 런타임시 계산되므로 그 혼란의 원인입니다. . iPhone에서 레이블의 너비가 설정되어 있으면 (IB에서) 문제가 없습니다.아이 패드 아이폰 하나는

라벨은 처음부터 그 폭을 알고 있다는 것 이렇게 :

  1. 두 개의 스토리 보드를 갖는

    문제를 해결하기위한 방법은 두 가지가 있습니다 iPhone에서도 마찬가지입니다. 아이폰과 아이 패드 모두를위한 하나의 스토리 보드를 갖는 enter image description here

  2. 가장의 텍스트를 맞는 그 결과 라벨에 코드에 의해 높이 제약 조건을 추가 크기를 계산하여이 문제를 해결 갈 수

    . desiredSize를 계산하려면 다음 공식을 사용하여 너비를 계산할 수 있습니다 : Current View's width - (Leading space + Trailing Space). 여기에 다른 사람이 자동 레이아웃을 사용하여이 같은 문제로 실행되는 경우 내 코드

CGSize desiredSize = [_bodyLabel sizeThatFits:CGSizeMake(self.view.frame.size.width-40, 10)]; 
NSString *visualContraint = [NSString stringWithFormat:@"V:[_bodyLabel(%.0f)]",desiredSize.height]; 
[_bodyLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:visualContraint 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:NSDictionaryOfVariableBindings(_bodyLabel)]]; 

enter image description here

4

입니다 ... 내가 작성하여 같은 문제를 해결할 수되었을 수도 있습니다 Coche가 제안한 제약 조건이지만, 나는 preferredMaxLayoutWidth이 너무 작아서 uilabel에 있다는 것을 깨달았습니다. 정확히 preferredMaxLayoutWidth (레이블의 실제 너비)을 설정하면 위쪽과 아래쪽의 간격이 사라집니다.

+0

이것은 * right */preferred answer IMHO입니다. 해결 방법 코드가 필요하지 않습니다 (UI 레이아웃이 적을 때 자동 레이아웃 + IB 경로를 사용할 때 더 좋습니다). 이 문제가 해결되었습니다. – Form

관련 문제