2012-01-13 7 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

Я могу предложить вам сначала создать все ярлыки, теперь после этого вы можете вычислить высоту представления dyanamically - label_height + offset_height_between_label + header_footer_offset. Теперь с этой высотой mch вы можете создать свой вид, а затем вы можете добавить там ярлык. – rishi

ответ

3

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

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

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

Помните, что UILables показывать только 1 строку текста. Также имейте в виду, что это вернет размер, который займет строка. Такие виды, как UILabels и UITextViews, как правило, добавляют заполнение, поэтому вам может понадобиться учитывать это при расчете высоты. После того, как вы рассчитали высоту и поместили каждую метку, вы должны знать размер, которым должен обладать супервизор, и установить его соответствующим образом. Кроме того, если вы не знаете, какая метка будет последней/самой низкой/самой далекой в ​​представлении (размер супервизора должен быть 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. В nib для этого файла у меня есть все мои объекты (метки, текстовые представления, кнопки и т. Д.) Внутри представления. Затем это представление находится внутри прокрутки. Есть ли что-то, что я делаю неправильно? – tallybear

+0

Не то, что я вижу, в конце этого метода просто измените размер представления, содержащего метки/текст/представления/кнопки/и т. Д., И я также установил для contentSize вид прокрутки. У вас должен быть доступ к обоим представлениям через переменные экземпляра класса CampgroundDetailsViewController. –

+0

Знаете ли вы, как динамически устанавливать представление на основе контента? Я слышал, что мне нужно использовать sizeToFit, но что я должен пройти? – tallybear

1

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

+0

Я рассмотрел использование UITextView, но проблема с этим связана с моей целевой демографией. Приложение, которое я создаю, предназначено для RVers. В настоящее время у нас есть приложение для iPhone, и мы получили больше жалоб, чем похвалы. Он использует UITextView для разделов «Направления», «Основные моменты» и «Примечания». Они жалуются, что они не могут получить представление для прокрутки, как только они попадут в TextView. 99% наших жалоб связаны с тем, что наши участники не знают, как использовать их устройства. – tallybear

+0

Если содержимое в UITextView меньше, чем UITextView, оно не будет прокручиваться. Я не вижу причин не использовать UITextView здесь. Но это зависит от вас. –

+0

Я до такой степени, что собираюсь рассказать старым людям об этом и использовать UITextView. Я просто заменил ярлык «Highlights» TextView, и он работает сказочно. Тогда мне не придется изменять размер представления. Я могу сделать его статическим, загружать кучу TextViews и не беспокоиться об этом. – tallybear

1

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

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

Просто примечание стороны. Эти два метода влияют только на подвыборки, а не на чертежи или основной текст.

+0

Я пробовал использовать sizeToFit на моем scrollView, но ничего не делает. У меня есть View внутри моего scrollView, и все в представлении. Должен ли я делать это по-другому? – tallybear

Смежные вопросы