2012-01-13 8 views
3

많은 양의 레이블이 구문 분석 된 XML로 채워진 뷰가 있습니다. 해당 뷰는 UIScrollView 내에 있습니다. 일부 XML은 레이블에 비해 너무 길다. XML 내용을 기반으로 레이블의 크기를 조정합니다. 레이블의 크기를 조정하면 UIView (즉, UIScrollView 내에 있음)의 크기가 조정되지 않아 이후 레이블과 겹칩니다. 나는 이것에 대한 답변을 찾으려고 몇 시간 동안 인터넷을 수색 해왔다. 그러나 내가 시도한 모든 것은 내가 원하는 것을 달성하지 못했다. 어떤 도움이라도 대단히 감사하겠습니다.내용 기반의 UIView 크기 조정

이것은 내 populateLabels 메소드입니다.

-(void) populateLabels { 

NSString *noInfo = (@"No Information Available"); 
lblCgName.text = _Campground.campground; 
NSString *cgLoc = _Campground.street1; 
NSString *cgCity = _Campground.city; 
NSString *cgState = _Campground.state1; 
NSString *cgCountry = _Campground.country; 
NSString *cgZipPostal = _Campground.zipPostal; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCity]; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgState]; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCountry]; 
cgLoc = [[cgLoc stringByAppendingString:@" "] stringByAppendingString:cgZipPostal]; 
lblCgLoc.text = cgLoc; 
double dRate = [_Campground.regRate1 doubleValue]; 
double dRate2 = [_Campground.regRate2 doubleValue]; 
NSString *rate = [[NSString alloc] initWithFormat:@"$%0.2f",dRate]; 
NSString *rate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dRate2]; 
if ([rate2 isEqualToString:@"$0.00"]) { 
    lblRate.text = rate; 
} else { 
    rate = [[rate stringByAppendingString:@" - "] stringByAppendingString:rate2]; 
    lblRate.text = rate; 
} 
double dPaRate = [_Campground.paRate1 doubleValue]; 
double dPaRate2 = [_Campground.paRate2 doubleValue]; 
NSString *paRate = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate]; 
NSString *paRate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate2]; 
if ([paRate2 isEqualToString:@"$0.00"]) { 
    lblPaRate.text = paRate; 
} else { 
    paRate = [[paRate stringByAppendingString:@" - "] stringByAppendingString:paRate2]; 
    lblPaRate.text = paRate; 
} 
lblLocal1.text = _Campground.localPhone1; 
lblLocal2.text = _Campground.localPhone2; 
lblTollFree.text = _Campground.tollFree; 
lblFax.text = _Campground.fax; 
lblEmail.text = _Campground.email; 
lblWebsite.text = _Campground.website; 
NSString *gps = _Campground.latitude; 
NSString *longitude = _Campground.longitude; 
gps = [[gps stringByAppendingString:@", "] stringByAppendingString:longitude]; 
lblGps.text = gps; 
lblHighlights.text = _Campground.highlights; 
lblHighlights.lineBreakMode = UILineBreakModeWordWrap; 
lblHighlights.numberOfLines = 0; 

//label resizing 

CGSize maximumLabelSize = CGSizeMake(296,9999); 

CGSize expectedLabelSize = [_Campground.highlights sizeWithFont:lblHighlights.font 
            constrainedToSize:maximumLabelSize 
                lineBreakMode:lblHighlights.lineBreakMode]; 

//adjust the label the the new height. 
CGRect newFrame = lblHighlights.frame; 
newFrame.size.height = expectedLabelSize.height; 
lblHighlights.frame = newFrame; 

lblTents.text = _Campground.tents; 
lblNotes.text = _Campground.notes; 
lblDirections.text = _Campground.directions; 
lblRentals.text = _Campground.rentals; 

} 
+0

당신은 http://stackoverflow.com/questions/2998336/how-to-create-a-uiscrollview-programmatically를 참조하십시오. 이것은 원하는 종류의보기를 만드는 데 도움이 될 것입니다 ... – rishi

+0

감사합니다. 입력,하지만 그건 내가 뭘 찾고 있어요. 그들은 코드로 스크롤보기를 만들고 크기를 조정합니다.내가 이미 가지고있는 스크롤보기 내에서 이미 가지고있는 뷰의 크기를 재조정하려고합니다. 모든 것이 작동하고 스크롤을 완전히 내립니다. 레이블이있는보기를 확장하면됩니다. – tallybear

+0

먼저 모든 레이블을 만들 것을 제안 할 수 있습니다. 이제이 후 뷰 높이를 다이내믹하게 계산할 수 있습니다 - label_height + offset_height_between_label + header_footer_offset. 이제이 mch 높이로보기를 만들 수 있고 거기에 레이블을 추가 할 수 있습니다. – rishi

답변

3

- (void) populateLabels 메서드는 어디에 있습니까? 보기 컨트롤러에있는 경우 크기를 조정해야하는보기에 쉽게 액세스 할 수 있어야합니다. 또는 이미 생성 된 것으로 보이는 레이블이 크기 조정이 필요한보기에 추가 된 경우 해당 슈퍼 뷰에 액세스 할 수 있습니다. 이미 필요한 크기가 있습니다. 메서드 끝에 슈퍼 뷰의 프레임 크기를 설정하면됩니다.

문자열 내용을 기반으로 각 레이블의 크기를 먼저 찾으려면 NSString 메서드 인 -sizeWithFont를 사용하는 것이 좋습니다. sizeWithFont -

컴퓨팅 통계 텍스트 의 단일 라인 : - sizeWithFont : forWidth : lineBreakMode : - sizeWithFont : minFontSize : actualFontSize : forWidth : lineBreakMode : 당신이 제약 조건을 지정할 수 있도록이 몇 가지 변화가있다 constrainedToSize : - sizeWithFont : sizeWithFont - 텍스트 의 여러 줄에 대한 컴퓨팅 통계 constrainedToSize : lineBreakMode :

UILables는 텍스트의 한 라인을 보여 것을 기억하십시오. 또한 문자열이 차지하는 크기를 반환합니다. UILabels 및 UITextViews와 같은보기는 패딩을 추가하는 경향이 있으므로 높이를 계산할 때 패딩을 고려해야 할 수 있습니다. 높이를 계산하고 각 레이블을 배치 한 다음에는 수퍼 뷰가 필요한 크기를 알고 적절하게 설정해야합니다. 또한보기에서 마지막/가장 아래/가장 아래에있는 레이블을 알지 못하는 경우 (superView의 크기는 origin.y + 마지막보기의 size.height 여야합니다.) 다음과 같이 할 수 있습니다.

CGFloat totalHeight = 0.0f; 
for (UIView *view in superView.subviews) 
    if (totalHeight < view.frame.origin.y + view.frame.size.height) totalHeight = view.frame.origin.y + view.frame.size.height; 

이렇게하면 슈퍼 뷰의 높이를 알 수 있습니다 (필요한 경우 너비에 대해서도 동일한 작업을 수행 할 수 있습니다).

+0

populateLabels 메서드는 내 CampgroundDetailsViewController.m 파일에 있습니다. 그 파일의 코코아 콩 안에, 나는 나의 목표 (레이블, 텍스트보기, 버튼 등)를 모두보기 안에 가지고있다. 그런 다음 해당보기는 스크롤보기 안에 있습니다. 내가 뭘 잘못하고 있니? – tallybear

+0

그 방법의 끝에서 레이블/텍스트 /보기/단추/등이 들어있는보기의 크기를 조정하면 스크롤보기의 contentSize를 조정할 수 있습니다. CampgroundDetailsViewController의 클래스 인스턴스 변수를 통해 두 뷰에 모두 액세스해야합니다. –

+0

콘텐츠를 기반으로보기를 동적으로 설정하는 방법을 알고 있습니까? sizeToFit을 사용해야한다고 들었는데, 무엇을 전달해야합니까? – tallybear

1

정말 많은 라벨을 사용해야합니까?
UITextView 또는 UIScrollView 사용해야 할 것 같습니다.

+0

UITextView 사용을 고려해 보았습니다.하지만 그 문제는 대상 인구 통계와 관련되어 있습니다. 내가 만들고있는 앱은 RVers 용으로 설계되었습니다. 우리는 현재 iPhone 앱을 보유하고 있으며 칭찬보다 불만이 많습니다. "Directions", "Highlights"및 "Notes"섹션에 대해 UITextView를 사용합니다. 그들은 일단 TextView에 도착하면 스크롤 할 뷰를 얻을 수 없다고 불평합니다. 99 %의 불만은 회원들이 장치 사용 방법을 모르기 때문에 발생합니다. – tallybear

+0

UITextView의 내용이 UITextView보다 적 으면 스크롤 할 수 없습니다. 여기에 UITextView를 사용하지 않을 이유가 없습니다. 그러나 그것은 당신에게 달려 있습니다. –

+0

나는 이제 막 노인들에게 그것을 다루고 UITextView를 사용할 것이라고 말하고있다. 방금 "하이라이트"레이블을 TextView로 대체하고 멋지게 작동합니다. 그런 다음보기의 크기를 조정할 필요가 없습니다. 나는 그것을 정적으로 만들 수 있고, 많은 TextViews를로드 할 수 있으며, 걱정하지 않아도됩니다. – tallybear

1

하위 뷰를 기반으로 UIView의 크기를 조정하는 일반적인 방법은 sizeToFit 입니다.이 메서드는 UIView의 크기를 자동으로 조정합니다.

크기를 제한하려면 sizeThatFits:을 사용해야합니다.이 방법은 UIView의 크기를 자동으로 조정하지 않고 크기를 반환합니다.

이 두 가지 방법은 하위보기 만 고려하므로 그림이나 핵심 텍스트가 아닙니다.

+0

sizeToFit 내 scrollView 사용하여 시도했지만 아무것도하지 않습니다. 내 scrollView 내부에보기가 있고 모든 것이보기에 있습니다. 내가 다른 방식으로해야할까요? – tallybear

관련 문제