UITableViewCell systemLayoutSizeFittingSize:在iOS 7上返回0

时间:2014-11-17 16:51:27

标签: ios uitableview autolayout ios7.1 ios8.1

我有一个UITableViewCell,UIImage固定在左上角,右边有一个标签:

    -(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;
}

当我在iOS 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}

我错过了什么?

修改 我使用[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];代替[cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

修复了问题

但这仅仅是一个修复:当我在单元格可见时旋转时,尺寸计算正常。但是,当我将单元格滚出屏幕时,旋转UI然后向后滚动到单元格,iOS 7.1中的高度计算再次出错

以下是从横向旋转到纵向之前的日志:

  

tableView bounds:{{0,0},{569,227}}

     

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

     

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

     

fittingSize:{559,162}

以下是从横向旋转到纵向后的日志:

  

tableView bounds:{{0,249},{321,463}}

     

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

     

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

     

fittingSize:{559,162}

如您所见,无论cell / cell.contentView的宽度是什么,大小计算都是相同的。

当从纵向旋转到横向时,这会导致超大单元格,以及从横向旋转到纵向时尺寸过小的单元格。

1 个答案:

答案 0 :(得分:0)

在systemLayoutSizeFittingSize:方法中使用cell.contentView而不是cell是正确的。 使用自动布局,所有自定义子视图只应添加到单元格的contentView以及约束中。然后,自动布局单元格可以正常工作。

作为你的第二个问题,我已经解决了类似的问题。在你的 - (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 
    ...

}