我使用Interface Builder创建了几个单元格,我正在使用它们来填充UITableView。换句话说,我有3个类用于3种不同类型的单元格,另一个视图包含一个UITableView。
- 我的UITableView包含不同类型的单元格:
这是我的问题: 在iPhone模拟器上,它看起来很棒。但在iPad模拟器上,自定义单元格宽度是固定的。 UITableView宽度适合屏幕宽度,因此它很好,但UITableViewCells不适合UITableView。 我想强制自定义UITableViewCells采用UITableView宽度。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中有什么可以做的,我在那里设置我的自定义单元格?
或者我是否必须在自定义单元格头文件中编写self.fitToParent;
之类的内容?
编辑(架构):
编辑2(cellForRowAtIndexPath方法):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifierType1 = @"cellType1";
static NSString *cellIdentifierType2 = @"cellType2";
NSString *currentObjectId = [[myTab objectAtIndex:indexPath.row] type];
// Cell type 1
if ([currentObjectId isEqualToString:type1])
{
CelluleType1 *celluleType1 = (CelluleType1 *)[tableView dequeueReusableCellWithIdentifier:cellIdentifierType1];
if(celluleType1 == nil)
celluleType1 = [[CelluleType1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierType1];
celluleType1.lblAuteur.text = @"Type1";
return celluleType1;
}
// Cell type 2
else if ([currentObjectId isEqualToString:type2])
{
CelluleType2 *celluleType2 = (CelluleType2 *)[tableViewdequeueReusableCellWithIdentifier:cellIdentifierType2];
if(celluleType2 == nil)
celluleType2 = [[CelluleType2 alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierType2];
celluleType2.lblAuteur.text = @"Type2";
return celluleType2;
}
else
return nil;
}
}
答案 0 :(得分:0)
我认为uitableviewcell的宽度与tableview的宽度相同。您可以尝试设置单元格的背景颜色来测试它。 cell.backgroundColor = [UIColor redColor] ;
你应该创建一个继承自UITableViewCell的类并覆盖它的方法- (void)layoutSubviews
,在那里调整你的内容框架。
答案 1 :(得分:0)
我在每个自定义单元格类中使用以下代码解决了我的问题。它不是很干净,但我不能再花一天时间来解决这个问题...
- (void)layoutSubviews
{
CGRect contentViewFrame = self.contentView.frame;
contentViewFrame.size.width = myTableView.bounds.size.width;
self.contentView.frame = contentViewFrame;
}
感谢您的帮助 KudoCC 。
答案 2 :(得分:0)
- (void)awakeFromNib {
[super awakeFromNib];
// anything you write in this section is taken with respect to default frame of width 320.
}
当[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]时调用awakeFromNib;已处理 - 您在截面中写入的任何内容都是针对宽度为320的默认帧进行的。 您需要创建另一个自定义函数,并在单元格初始化后调用它。 例如: -
@implementation CheckinTableViewCell{
UILabel *NameLabel;
UILabel *rollLabel;
}
- (void)awakeFromNib {
[super awakeFromNib];
NameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
rollLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[self.contentView addSubview:NameLabel];
[self.contentView addSubview:rollLabel];
}
-(void) bindView{
NameLabel.frame = CGRectMake(10, 10, self.contentView.frame.size.width-20, 20);
rollLabel.frame = CGRectMake(10, 30, NameLabel.frame.size.width, 20);
}
并在tableview cellForRowAtIndex中调用此函数: -
-(UITableViewCell*) tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
CheckinTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if(cell ==nil){
cell = [[CheckinTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.name = @"Harry";
cell.rollno = @"123456";
[cell bindView];
return cell;
}