7842


iPhoneの画面が回転して横向きになったときに`AutoLayout`を使って`TableView`のセル内の`ScrollView`を画面いっぱいまで伸ばし、ひとまず下記の画像のようになりました。

![画像の説明をここに入力](https://i.stack.imgur.com/K9BxC.png)

しかし、`TableView`を上のセルが見えなくなるまでスクロールし、また上のセルまで戻ってくると以下の画像のようになってしまいます。

![画像の説明をここに入力](https://i.stack.imgur.com/yLVow.png)

これは`TableView`のセルの使い回しが影響しているものと思うのですが、どうすれば画像が重なることを回避することができるでしょうか？  
どなたか分かる方がいれば教えていただきたいです。  
すみませんが、よろしくお願いします。

---追記---
[code]

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static const id identifiers[5] = {@"normalCell", @"cell", @"detailCell", @"halfCell", @"normalCell"};
        NSString *CellIdentifier = identifiers[indexPath.row];
    
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            switch (indexPath.row) {
                case 0:
                    cell = [[NormalScrollCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
                    break;
                case 1:
                    cell = [[PagerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                    break;
                case 2:
                    cell = [[DetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                    break;
                case 3:
                    cell = [[HalfPager alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                    break;
                default:
                    cell = [[NormalScrollCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                    break;
            }
        }
        return cell;
    }
    
[/code]


CC BY-SA 3.0
2015-03-11T08:34:40.457
7778
2015-03-12T11:09:49.003
2015-03-12T01:53:00.717
5210
5210
question
objective-c uitableview autolayout
セルが使いまわされた時にセル内の画像が重なる


cellForRowAtIndexPathではどのようにcellの描画をしていますか？  
以前私が同じような事象になった際は  
cellForRowAtIndexPathで一度cell内のsubviewを削除しました。

[code]

    for (UIView *subview in [cell.contentView subviews]) {
        [subview removeFromSuperview];
    }
    
[/code]

他にもっと良い方法があるかもしれませんが。


CC BY-SA 3.0
2015-03-11T08:46:23.250
7782
2015-03-11T08:46:23.250
8772
7778
answer


初めまして。  
カスタムCellを使用していると思うのですが、Cellの高さ計算があっていないのではないでしょうか？  
私もCellがオーバーラップして表示された時がありました。  
このメソッドで正しいCellの値が返されていますか？  
`  
func tableView(tableView: UITableView, heightForRowAtIndexPath
indexPath:NSIndexPath) -> CGFloat  
`


CC BY-SA 3.0
2015-03-12T01:44:31.710
7811
2015-03-12T01:44:31.710
297
7778
answer


「追記」を見て、ようやくわかりました。  
プログラムでセルを生成しているのなら、いくらAutoLayoutを、Storyboard上で編集しても、意味ありません。 **alloc+init**
で生成したインスタンスは、Storyboard上のインスタンスと、おなじクラスであっても、別物です。

[code]

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier
    
[/code]

このメソッドでなく、

[code]

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath
    
[/code]

を使ってください。Storyboard上で、Prototype Cellsに正しくIdentifierが設定されていれば、`if (cell ==
nil)`以下のコードが不用になります。

[code]

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static const id identifiers[5] = {@"normalCell", @"cell", @"detailCell", @"halfCell", @"normalCell"};
        NSString *CellIdentifier = identifiers[indexPath.row];
    
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath.row];
    
        return cell;
    }
    
[/code]

これだと、Storyboard上のセルに対するAutoLayoutの設定が反映されます。  
また、副産物で、テーブルビュー表示にかかる時間が、わずかでも短くなる、ということです。


CC BY-SA 3.0
2015-03-12T10:54:57.680
7842
2015-03-12T11:09:49.003
2015-03-12T11:09:49.003
7362
7362
7778
answer