我已经使用 XIB 文件创建了自定义 UITableViewCell 并让它在 UITableView 中工作。我设计了自定义单元格,它是纵向尺寸的子视图,但是当我在风景模式下旋转设备时,我想调整单元格的大小,它是子视图。我为此编写了以下代码,但不确定为什么可见单元格中只有一个单元格被调整大小而其余部分保持不变!有人可以帮助我调整自定义单元格及其子视图大小的标准做法吗?谢谢。
#pragma mark - UITableView delegate methods
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CustomTableViewCellIdentifier";
CustomTableViewCell *cell = (CustomTableViewCell*)[tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// Load custom cell from NIB
self.customTableViewCell = [[[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil] objectAtIndex:0];
cell = _customTableViewCell;
}
// Use cell
...
}
#pragma mark - Layout views
- (void)layoutForOrientation:(UIInterfaceOrientation)orientation {
if (UIInterfaceOrientationIsPortrait(orientation))
[self layoutPortraitViews];
else
[self layoutLandscapViews];
}
- (void)layoutLandscapViews {
self.customTableViewCell.frame = CGRectMake(0, 0, 1024, 40);
self.customTableViewCell.contentSize = CGSizeMake(1024, 40);
self.customTableViewCell.cellBackgroundImageView.frame = CGRectMake(0, 0, 1024, 40);
self.customTableViewCell.assetNameLabel.frame = CGRectMake(15, 0, 245, 20);
self.customTableViewCell.assetTypeLabel.frame = CGRectMake(15, 20, 245, 20);
self.customTableViewCell.assetImageView.frame = CGRectMake(265, 20, 120, 20);
self.customTableViewCell.assetValueLabel.frame = CGRectMake(265, 20, 120, 20);
[self.tableView reloadData];
}
- (void)layoutPortraitViews {
self.customTableViewCell.frame = CGRectMake(0, 0, 768, 40);
self.customTableViewCell.contentSize = CGSizeMake(768, 40);
self.customTableViewCell.cellBackgroundImageView.frame = CGRectMake(0, 0, 768, 40);
self.customTableViewCell.assetNameLabel.frame = CGRectMake(15, 0, 180, 20);
self.customTableViewCell.assetTypeLabel.frame = CGRectMake(15, 20, 180, 20);
self.customTableViewCell.assetImageView.frame = CGRectMake(200, 20, 90, 20);
self.customTableViewCell.assetValueLabel.frame = CGRectMake(200, 20, 90, 20);
[self.tableView reloadData];
}
[解决方案]
经过一番挣扎后,这项工作得到了解决。更改单元格的大小及其子视图不起作用,因为我必须处理方向更改,继续重复使用单元格以提高性能,并且当您旋转设备时可见单元格会发生变化,因此无法使用我的第一种方法找出解决方案。这是我的另一个解决方案。
这里的挑战是在不影响性能的情况下同时处理方向和自定义单元格。
我在 NIB 中创建了两个单元格视图,一个用于纵向,另一个用于横向。
使用了两个变量;
BOOL refreshing;
UIInterfaceOrientation currentOrientation;
从视图将出现;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
[self layoutForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
来自轮换代表;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
refreshing = YES;
currentOrientation = toInterfaceOrientation;
[UIView animateWithDuration:duration animations:^{
[self.tableView reloadData];
[self layoutForOrientation:toInterfaceOrientation];
}];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
refreshing = NO;
}
来自 tableview 委托;
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CustomTableViewCellIdentifier";
CustomTableViewCell *cell = (CustomTableViewCell*)[tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil || refreshing)
{
if (UIInterfaceOrientationIsPortrait(currentOrientation))
cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil] objectAtIndex:0];
else
cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil] objectAtIndex:1];
}
//Use cell
}
...因此,此解决方案仅在发生方向更改事件时才会重新加载单元格。快乐编码:-)