2014-11-17 4 views
6

У меня есть UITableViewCell с UIImage, закрепленной на левый верхний углу, и этикетками на своем праве:UITableViewCell systemLayoutSizeFittingSize: возвращение 0 на прошивке 7

-(UITableViewCell*) adCellFromTableView:(UITableView*)tableView 
{ 
    //Build the text 
    NSString* adText = NSLocalizedString(@"MyFamily_fremiumAd", nil); 
    NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:adText]; 

    NSUInteger newLineLocation = [adText rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location; 

    //Set the first line in orange 
    NSDictionary* firstLineAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:15], 
              NSForegroundColorAttributeName:ORANGE}; 
    [attrString addAttributes:firstLineAttributes range:NSMakeRange(0, newLineLocation)]; 
    //Set other lines in white 
    NSDictionary* otherLinesAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:11], 
              NSForegroundColorAttributeName:[UIColor whiteColor]}; 
    [attrString addAttributes:otherLinesAttributes range:NSMakeRange(newLineLocation, adText.length - newLineLocation)]; 

    //Get the cell 
    if (!adCell) 
    { 
     adCell = [tableUsers dequeueReusableCellWithIdentifier:@"fremiumAd"]; 
    } 

    //Set the text 
    UILabel* label = (UILabel*)[adCell viewWithTag:1]; 
    label.attributedText = attrString; 

    //Hide the separator 
    adCell.separatorInset = UIEdgeInsetsMake(0, adCell.bounds.size.width, 0, 0); 

    return adCell; 
} 


-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell* cell = [self adCellFromTableView:tableView]; 

      //Make sure the cell's bounds are the same as tableview's before calculating the height 
      //This is important when we calculate height after a UI rotation. 
      cell.bounds = CGRectMake(0, 0, tableView.bounds.size.width, 0); 
      NSLog(@"cell.bounds: %@",NSStringFromCGRect(cell.bounds)); 
      [cell setNeedsLayout]; 
      [cell layoutIfNeeded]; 

      CGSize fittingSize = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
      NSLog(@"fittingSize: %@",NSStringFromCGSize(fittingSize)); 
      return fittingSize.height; 
} 

Когда я запустить приложение на прошивке 7.1 имитатора, systemLayoutSizeFittingSize всегда возвращают 0:

cell.bounds: {{0, 0}, {320, 0}}

fittingSize: {0,0}

Когда я запустить приложение на IOS, 8.1 тренажере, systemLayoutSizeFittingSize возвращает правильное значение:

cell.bounds: {{0, 0}, {320, 0}}

fittingSize: {320 , 154,5}

Что мне не хватает?

Edit: Я вроде исправили проблему с помощью [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; вместо [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

Но это только половина исправить: когда я поворачиваю в то время как клетка видно, расчет размера в порядке. Но когда я прокручиваю ячейку из экрана, поворачивать интерфейс, а затем вернитесь к ячейке, вычисление высоты неправильно снова прошивка 7.1

Вот бревно перед поворотом от пейзажа до портрета:

Tableview границы: {{0, 0}, {569, 227}}

cell.bounds: {{0, 0}, {569,0}}

cell.contentView: {{0, 0}, {569, 0}}

fittingSize: {559, 162}

Вот журналы после поворота от пейзажа до портрета:

Tableview границ: {{0, 249}, {321, 463}}

cell.bounds: {{0, 0}, {321,0}}

cell.contentView: {{0, 0}, {321, 0}}

fittingSize: {559, 162}

Как вы можете видеть, расчет размера такой же, независимо от ширины ячейки/cell.contentView.

Это приводит к уменьшению размера ячейки при повороте от портретного к пейзажу и к уменьшенной ячейке при повороте с пейзажа на портрет.

+0

Наконец-то исправлено его перезагрузкой таблицы в didRotateFromInterfaceOrientation: но я все еще ищу что-то, работая без перезагрузки таблицы. – Imotep

ответ

0

Вы правы, используя cell.contentView вместо ячейки в systemLayoutSizeFittingSize: method. Используя автоматическую компоновку, все пользовательские подзапросы должны быть добавлены только в contentView камеры, а также в ограничения. Затем ячейки Auto Layout работают хорошо, как и ожидалось.

Как ваш второй вопрос, я решил аналогичную проблему. Вставьте следующий код в ваш - (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation, возможно, поможет вам решить эту проблему.

-(void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    // Update the layout for the new orientation 
    //Maybe you should change it to your own tableview 
     [self updateViewConstraints]; 
     [self.view layoutIfNeeded]; 
    // other any code 
    ... 

}