Изменение размера UIView на основе содержимого - PullRequest
3 голосов
/ 13 января 2012

У меня есть представление с множеством меток, заполненных анализируемым XML.Это представление в UIScrollView.Часть XML слишком длинна для меток.Я изменяю размеры ярлыков на основе содержимого XML.Когда размеры меток изменяются, они перекрывают последующие метки, потому что размер моего UIView (то есть внутри UIScrollView) не изменяется.Я часами рыскал в интернете, пытаясь найти ответ на этот вопрос, но все, что я пробовал, не достигло того, что я искал.Любая помощь будет принята с благодарностью.

Это мой метод 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;

}

Ответы [ 3 ]

3 голосов
/ 13 января 2012

Где находится метод - (void) populateLabels?Если он находится в контроллере вида, у вас должен быть легкий доступ к виду, размер которого нужно изменить.Или же, если метки (которые уже созданы) были добавлены в представление, размер которого необходимо изменить, вы можете получить доступ к их суперпредставлению.У вас уже есть нужный размер, просто установите в конце метода размер кадра суперпредставления.

Если вы сначала пытаетесь найти размер каждой метки на основе содержимого строки, вы 'Я хочу использовать метод NSString: -sizeWithFont.Существует несколько вариантов этого, которые позволяют указывать ограничения:

Вычисление метрик для отдельной строки текста - sizeWithFont: - sizeWithFont: forWidth: lineBreakMode: - sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: вычисление метрикдля нескольких строк текста - sizeWithFont: constrainedToSize: - sizeWithFont: constrainedToSize: lineBreakMode:

Помните, что в UILables отображается только 1 строка текста.Также имейте в виду, что это вернет размер, который займет строка.Представления типа UILabels и UITextView имеют тенденцию добавлять отступы, поэтому вам может потребоваться учитывать это при расчете высоты.После того, как вы вычислили высоту и поместили каждую метку, вы должны знать размер, который должен иметь superView, и установить его соответствующим образом.Кроме того, если вы не знаете, какая метка будет последней / самой низкой / самой дальней в представлении (размер 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;

Это даст вам высоту суперпредставления, если вы еще этого не знаете (и вы можете сделать то же самое для ширины, если это необходимо).

1 голос
/ 13 января 2012

Общий метод изменения размера UIView на основе его подпредставлений: sizeToFit Этот метод автоматически изменяет размер вашего UIView.

Если вы хотите ограничить размер, вам нужно будет использовать sizeThatFits: Этот методне изменяет размер вашего UIView автоматически, скорее он возвращает размер.

Просто примечание: эти два метода учитывают только подпредставления, а не рисунки и основной текст.

1 голос
/ 13 января 2012

Вам действительно нужно использовать несколько ярлыков?
Кажется, вам нужно использовать UITextView или UIScrollView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...