2017-06-07 12 views
0

私はカスタムテーブルビューセルをデザインします。私がTableViewをスクロールすると、Cell Viewは最初と最後のセルのx位置を移動します。なぜこの問題が起こったのか?UITableViewCell UIViewアライメントの問題

私は問題を理解するためにいくつかのコードとイメージを入れました。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CreateQuestionViewCell 
     //let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CreateQuestionViewCell 

     //let subview = cell.viewWithTag(1)! 

     //let textDetail = cell.viewWithTag(2) as! UILabel 
     cell.quesLbl.text = ((arrTableData[indexPath.row] as! Question).que).convertHTMLtoSymbols() 

     //let edit = cell.viewWithTag(3) as? UIButton 
     cell.editBtn.tag = indexPath.row 
     cell.editBtn.addTarget(self, action: #selector(EditButActions(sender:)), for: .touchUpInside) 

     //let deleteBut = cell.viewWithTag(4) as? UIButton 
     cell.deleteBtn.tag = indexPath.row 
     cell.deleteBtn.addTarget(self, action: #selector(deleteButActions(sender:)), for: .touchUpInside) 

     if NotEditable { 
      cell.editBtn.isHidden = true 
      cell.deleteBtn.isHidden = true 
     } else { 
      cell.editBtn.isHidden = false 
      cell.deleteBtn.isHidden = false 
     } 
     cell.quesLbl.font = UIFont(name: "Roboto-Regular", size: 14)! 
     let desiredWidth: CGFloat = UIScreen.main.bounds.size.width - 60 
     let size: CGSize = cell.quesLbl.sizeThatFits(CGSize.init(width: desiredWidth, height: CGFloat.greatestFiniteMagnitude)) 
     cell.quesLbl.numberOfLines = 0 
     cell.quesLbl.lineBreakMode = NSLineBreakMode.byWordWrapping 
     if NotEditable { 
      cell.subview.frame = CGRect.init(x: 10, y: 10, width: Int(UIScreen.main.bounds.width - 40), height: Int(20 + size.height)) 
     } else { 
      cell.subview.frame = CGRect.init(x: 10, y: 10, width: Int(UIScreen.main.bounds.width - 40), height: Int(50 + size.height)) 
     } 
     cell.subview.layer.cornerRadius = 2.0 
     cell.subview.layer.borderWidth = 1.0 
     cell.subview.layer.borderColor = UIColor.clear.cgColor 
     // SubView.layer.masksToBounds = true; 

     cell.subview.layer.shadowColor = UIColor.init(red: 200/255, green: 200/255, blue: 200/255, alpha: 1).cgColor 
     cell.subview.layer.shadowOffset = CGSize.init(width: 0.5, height: 0.5) 
     cell.subview.layer.shadowRadius = 2.0 
     cell.subview.layer.shadowOpacity = 1.0 
     cell.subview.layer.masksToBounds = false 
     //cell.subview.layer.shadowPath = UIBezierPath(roundedRect: cell.subview.bounds, cornerRadius: cell.subview.layer.cornerRadius).cgPath 
     cell.layoutIfNeeded() 
     return cell 
    } 

enter image description here

+0

どこからテーブルビューをリロードしていますか?あなたはメインスレッドからそれをやっていますか? –

+0

@BadhanGanesh返事をありがとう。はい、私はメインスレッドにリロードしますが、私が常に上下にスクロールすると、セル内のx位置が少し移動します。画像を見てください。 :) – ilesh

答えて

0

ので、細胞が再利用されていることを覚えて、いつでもあなたがテーブルで表示され、後続のすべてのセルに追加され、cellForRowAt:にセルに何も追加。

ストーリーボードのプロトタイプでできることをすべて設定します。ストーリーボードインタフェースビルダーを使用してボタンとサブビューを追加し、ターゲットを設定し、制約を追加します。

cellForRowAt:で、セルからセルに変化するもの、画像のビュー内のラベルや画像のテキスト文字列を設定するだけです...セル内でボタンを使用する場合は、 cell.editBtn.tag = indexPath.rowを使用して、ボタンターゲット機能内のセルを識別する。ただし、ターゲット関数内のセルを直接変更するのではなく、タグに基づいてデータソースからデータを取得し、reloadDataを使用してテーブルを再描画してください。

これが役に立ちます。

+0

あなたの返事をありがとう。私はセルとアクセスフォームのタグですべてのビューを設定しますが、私の質問は、私はテーブルのビューをスクロールするとき、ほとんどのセルビューは、画像のような小さなxの位置を移動するときです。理由は何か、どうすれば解決できるか。ありがとう – ilesh

+0

理由はあなたがcell.subviewを操作し、テーブルのレイアウトを妨害するためです。すべてのcell.subview呼び出し(特にフレームの変更)と 'cell.layoutIfNeeded()'を取り出して、うまくいくはずです。 UITableViewは、セルのレイアウトに十分注意します。 – FryAnEgg