我有一个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的宽度是什么,大小计算都是相同的。
当从纵向旋转到横向时,这会导致超大单元格,以及从横向旋转到纵向时尺寸过小的单元格。
答案 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
...
}