2013-12-05 3 views
0

Я использую tableview на раскадровке.UILabel не меняет высоту в UITableViewCell в первом прокрутке

Я меняю рамку наклейки в (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath функция.

После этого, после прокрутки, он может изменить рамку. но при открытии приложения фрейм сначала не меняется.

извините, не могу опубликовать изображение до 10 репутации. прошу помочь.

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
// get one row 
Plan* planObj = [_planObjList objectAtIndex:indexPath.row]; 

// get custom cell info 
LargeImageCell* cell = (LargeImageCell*)[tableView dequeueReusableCellWithIdentifier:@"CustomLargeImageCell"]; 

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]]; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
cell.titleLabel.text = planObj.planTitle; 
cell.titleLabel.numberOfLines = 0; 
cell.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; 
cell.userNameLabel.text = planObj.getProducerName; 

// title size 
CGSize titleSize = [cell.titleLabel.text boundingRectWithSize:CGSizeMake(300.0f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName: cell.titleLabel.font} context:nil].size; 
// user name size 
CGSize userNameSize = [cell.userNameLabel.text boundingRectWithSize:CGSizeMake(300.0f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName: cell.userNameLabel.font} context:nil].size; 

// set title size 
cell.titleLabel.frame = CGRectMake(7.0f, 230.0f, 306.0f, ceilf(5.0f + titleSize.height)); 
cell.titleLabel.backgroundColor = [UIColor redColor]; 

// set name size 
cell.userNameLabel.frame = CGRectMake(7.0f, ceilf(235.0f + titleSize.height), 148.0f, ceilf(5.0f + userNameSize.height)); 
cell.userNameLabel.backgroundColor = [UIColor blueColor]; 
} 
+0

Вы можете поместить свой снимок экрана на любом сервере, и долю ссылка изображения – Mutawe

+0

спасибо. Я добавил снимок экрана. – naohide

ответ

4

автоспуск был проблема.
Я отключил «Использовать автоспуск» на раскадровке. тогда стало ясно.

спасибо.

+0

omg, спасибо за это. Я потратил около 5 часов, пытаясь понять это. вы спаситель. –

+0

> Andy Shin: прибытие сюда - мое удовольствие. – naohide

0

Вы не можете изменить размер первоначально с помощью метода cellForRow. Вам нужно рассчитать размер и вернуть его в следующем делегатом

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

Для вычисления размера для метки на основе текста, используйте

NSString *[email protected]"some text"; 
[myLabel setText:labelText]; 
UIFont *labelTextFont = [UIFont fontWithName:@"Helvetica" size:labelTextsize]; 
CGSize labelFrameSize = [labelText sizeWithFont:labelTextFont]; 
myLabel.frame = CGRectMake(xPos, yPos, labelFrameSize.width, labelFrameSize.height); 
+0

спасибо. но, я знаю о высоте ячейки. Я имею в виду, что uilabel не меняется в первую очередь. – naohide

+0

Пожалуйста, уточните обновленный ответ – Premsuraj

+0

спасибо. Я попробовал. но я не мог. Я думаю, что это проблема раскадровки. Я установил метки ярлыка в ячейке в раскадровке, тогда я не могу. следует ли делать ярлыки, не используя раскадровку? фиксирующие метки размера рамки не являются проблемой в раскадровке, но у гибких рамных меток есть проблемы, я чувствую. – naohide

0

Если ваше приложение использует Autolayout вы должны делать это с ограничениями , Чтобы изменить размер UILabel с ограничениями, которые должны, по крайней мере, что свойства: Line Numbers = 0 Line Breaks = Слово Wrap

А насчет ограничений вы должны установить с обеих сторон, и один вверх, DONT установлен в нижней части !!

Чтобы установить правильный размер в строке и можно использовать этот пример кода:

- (CGFloat) Tableview: (UITableView *) Tableview heightForRowAtIndexPath: (NSIndexPath *) indexPath { данных ID = [self.listOfNews safeObjectAtIndex : indexPath.row];

UIFont *font = [UIFont fontWithName:K_FONT_AVENIR_MEDIUM size:textSize]; 

if ([data isKindOfClass:[NewsModel class]]) { 
    NewsModel *news = (NewsModel *)data; 

    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) { 
     CGSize constraintSize = CGSizeMake(cellTextWidth, MAXFLOAT); 
     CGSize textRect = [news.title sizeWithFont:font constrainedToSize:constraintSize]; 

     return textRect.height + paddingTopAndBottom; 
    } else { 
     CGRect textRect = [news.title boundingRectWithSize:CGSizeMake(cellTextWidth, CGFLOAT_MAX) 
                options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:@{NSFontAttributeName:font} 
                context:nil]; 

     return textRect.size.height + paddingTopAndBottom; 
    } 
} 

return 0; 

}

+0

спасибо. Я хочу сначала изменить структуру uilabel. вы можете проверить снимки экрана? – naohide

+0

Обычно метод cellForRowAtIndexPath используется для установки идентификатора ячейки, для построения элементов в правильном используется метод willDisplayCell. Мое предложение - использовать метод willDisplayCell или использовать autolayout (с использованием ограничения намного лучше). Вы используете xib или раскадровку? Какие ios разрабатываются? – AMarones

+0

благодаря вашему ответу. Я использую раскадровку на ios7. Я пытался использовать willDisplayCell, но я не мог измениться. Я попытаюсь использовать автозапуск. Знаете ли вы несколько примеров? – naohide

0

Попробуйте изменить размер кадров в willDisplayCell метод делегата.

+1

спасибо. Я попробовал это. но я не мог .. – naohide

0

Запомнить эти шаги для того, чтобы иметь UILabel изменить размер:

1) Если у вас есть заказ UITableViewCell, выключите AutoLayout на элементах клетки

2) Используйте heightForRowAtIndex метод протокола для изменения высота

3) Установите numberOfLines = 0 для UILabel внутри клетки

4) Если это не работает повторно-ы и др репер (я обнаружил, что это происходит, когда вы пытаетесь, чтобы увеличить UILabel в каком-то «дальнем» конце ячейки)

Примеры

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
GeneralCell* cell  = [tableView dequeueReusableCellWithIdentifier:@"GeneralCell"]; 
    if (cell == nil) { 
     cell = [[GeneralCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GeneralCell"]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    /////// USE the following block if still in trouble 
    CGRect frame = cell.label.frame;  
    [cell.label setFrame:frame]; 
    [cell.label sizeToFit]; // this should not be necessary in general 
    /////////// 
} 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString  *detail = [NSString stringWithFormat:@"YOUR TEXT]]; 

    CGSize constraintSize = CGSizeMake(CELL_CONTENT_WIDTH, MAXFLOAT); 
    CGSize labelSize = [detail boundingRectWithSize:constraintSize 
              options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]} 
              context:nil].size; 


    float h = (fmod((int)labelSize.height ,2) == 0) ? labelSize.height : labelSize.height+1; 
    CGFloat height = MAX(h, 30.0f); 
    elemento = nil; 
    detail = nil; 
    return height + (CELL_CONTENT_MARGIN * 2); 
} 
Смежные вопросы