

InterfaceBuilderを使用しないでカスタムCellを使用したTableViewを作成しています。

`ViewController`で`UITableView`を追加して  
`CustomCell`クラスを作成し、その`ContentView`に`CustomView`クラスを追加しています。

`ViewController`で

[code]

    [_tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"Cell"];
    
[/code]

を使用して起動すると  
１つのセルに複数のセルがかぶって表示されます

`ViewController.m`

[code]

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        return cell;
    }
    
[/code]

`CustomCell.m`

[code]

        - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
        {
            self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
            if (self) {
                for (UIView *subview in [self.contentView subviews]) {
                    [subview removeFromSuperview];
                }
    
                _dateLabel  = [[UILabel alloc] initWithFrame:CGRectMake(16, 0, 320 - (16 * 2), 20)];
                _dateLabel.font = [UIFont systemFontOfSize:15];
                _dateLabel.text = [[NSDate date] description];
                [self.contentView addSubview:self.dateLabel];
    
                // ここのビューがスクロール時に２重に表示されることがある
                CGRect rect1 = CGRectMake(0, 20, 160, 20);
                _view1 = [[CustomView alloc] initWithFrame:rect1];
                [self.contentView addSubview:_view1];
    
                CGRect rect2 = CGRectMake(160, 20, 160, 20);
                // その他ViewをaddSubView
            }
            return self;
        }
    
[/code]

`CustomView.m`

[code]

        - (id)initWithFrame:(CGRect)frame
        {
            self = [super initWithFrame:frame];
            if (self) {
                // Initialization code
                [self initializeView:frame];
            }
            return self;
        }
        -(void)initializeView:(CGRect)frame
        {
            for (UIView *subview in [self subviews]) {
                [subview removeFromSuperview];
            }
    
            _titleLabel = [[UILabel alloc] init];
            _titleLabel.frame = CGRectMake(44 + 16, 0, 160 - 44, 22);
            _titleLabel.text = @"text";
            [self addSubview:_titleLabel];
    
            _conditionLabel = [[UILabel alloc] init];
            _conditionLabel.frame = CGRectMake(44 + 16, 22 + 4, 160 - 44, 22);
            _conditionLabel.text = @"text2";
            [self addSubview:_conditionLabel];
        }
    
[/code]

原因は`cellForRowAtIndexPath`で@"Cell"のIDでセルを再使用しているため起こる原因と思いますが、  
`registerClass`でIDを固定しているため、複数のIDで再使用をしないということができません。  
カスタムCellを使用して、そのCellに`addView`した状態で表示が重ならない方法はありますか?

![こんな状態で表示されます](https://i.stack.imgur.com/1fjvX.png)


CC BY-SA 3.0
2015-06-27T12:32:42.400
11804
2015-06-28T09:57:07.650
2015-06-28T09:57:07.650
356
356
question
ios objective-c uitableview
UITableViewでカスタムCellを使用した時に表示が重なる


スクリーンショットを拝見させていただいた範囲で判断できるのは、テーブルの行の高さと、ひとつひとつのセルの高さが一致していないという点です。テーブルの行の高さは、セルのサイズにあわせて、自動で調節されるわけではないという点を、ご留意ください（※）。  
テーブルの行の高さは、`UITableView`のプロパティ`rowHeight`で調節します。セルが重ならないようにするには、すくなくとも現状の2.7倍にはしないといけなさそうです。  
なお、行間をひとつずつ異なる値にするには、`UITableViewDataSource`プロトコルの、`\-
(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath`メソッドを使います。

※Auto Layoutを利用して、セルのサイズに合わせて、行間を自動調節する手法は、あるらしい。


CC BY-SA 3.0
2015-06-28T03:17:16.393
11814
2015-06-28T05:53:40.433
2015-06-28T05:53:40.433
7362
7362
11804
answer