如何在自定义UITableViewCells和UITableView之间设置相同的宽度?

时间:2013-11-18 09:30:18

标签: ios iphone uitableview

我使用Interface Builder创建了几个单元格,我正在使用它们来填充UITableView。换句话说,我有3个类用于3种不同类型的单元格,另一个视图包含一个UITableView。

- 我的UITableView包含不同类型的单元格: enter image description here

这是我的问题: 在iPhone模拟器上,它看起来很棒。但在iPad模拟器上,自定义单元格宽度是固定的。 UITableView宽度适合屏幕宽度,因此它很好,但UITableViewCells不适合UITableView。 我想强制自定义UITableViewCells采用UITableView宽度。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中有什么可以做的,我在那里设置我的自定义单元格? 或者我是否必须在自定义单元格头文件中​​编写self.fitToParent;之类的内容?

编辑(架构):

enter image description here

编辑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;
}
}

3 个答案:

答案 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;
}