質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2378閲覧

UITableViewCell並び替え時にセルの背景などが半透明になるのを防ぎたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/12/06 13:41

編集2018/12/13 02:22

いつもお世話になります。

tableView(_:canMoveRowAt:) -> Booltrueにして並び替えをしている際、並び替えするセルを選択するとセルの上に乗っているUIViewの背景などが透明になり、背後に隠れているUIView/Labelなどが見えてしまうのですが、これを防ぐにはどうしたら良いでしょうか?

並び替えするセルの選択状態が解除される際は、func setSelected(_ selected: Bool, animated: Bool)func setHighlighted(_ highlighted: Bool, animated: Bool)を通るのですが、並び替えセルが選択状態になる(透明になる)際にはこの2つのメソッド(func setSelected(_ selected: Bool, animated: Bool)func setHighlighted(_ highlighted: Bool, animated: Bool))は呼び出されないので、並び替えのときは違うメソッドで背景色を透明にしていると思われるのですが、
該当するメソッドをご存知でしたら教えてください。

イメージ説明

swift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 4 5 @IBOutlet weak var tTableView: UITableView! 6 7 var tArray = ["AAAAAA", "BBBBBB", "CCCCCC", "DDDDDD"] 8 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 let CellNib = UINib.init(nibName: "CustomCell", bundle: Bundle.main) 15 tTableView.register(CellNib, forCellReuseIdentifier: "CCell") 16 17 tTableView.isEditing = true 18 } 19 20 21 // numOfCell 22 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 23 return tArray.count 24 } 25 26 // generateCell 27 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 28 let cell = tableView.dequeueReusableCell(withIdentifier: "CCell", for: indexPath) as! CustomCell 29 30 //cell.selectionStyle = .none 31 32 cell.titleLabel.text = tArray[indexPath.row] 33 34 return cell 35 } 36 37 // 38 func tableView( 39 _ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 40 41 if let cell = tTableView.cellForRow(at: indexPath) as? CustomCell { 42 43 print("# cell:", cell) 44 45 cell.greenView.backgroundColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1) 46 cell.blueView.backgroundColor = #colorLiteral(red: 0.4745098054, green: 0.8392156959, blue: 0.9764705896, alpha: 1) 47 48 } else { 49 print("### cell:", cell) 50 } 51 } 52 53 // sortable 54 func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 55 return true 56 } 57 58 // editArray 59 func tableView( 60 _ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { 61 // レコード配列を編集する 62 let targetArray = tArray.remove(at: sourceIndexPath.row) 63 tArray.insert(targetArray, at: destinationIndexPath.row) 64 } 65 66 // indicateEditButton 67 func tableView(_ tableView: UITableView, editingStyleForRowAt indecxPath: IndexPath) 68 -> UITableViewCell.EditingStyle { 69 return .none 70 } 71 72 // spaceOfEditIco 73 func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPaht: IndexPath) -> Bool { 74 return false 75 } 76} 77

swift

1import UIKit 2 3class CustomCell: UITableViewCell { 4 5 @IBOutlet weak var titleLabel: UILabel! 6 7 @IBOutlet weak var greenView: UIView! 8 @IBOutlet weak var blueView: UIView! 9 10 11 @IBOutlet weak var blueViewAppeared: NSLayoutConstraint! 12 @IBOutlet weak var blueViewDisappeared: NSLayoutConstraint! 13 14 override func awakeFromNib() { 15 super.awakeFromNib() 16 // Initialization code 17 } 18 19 @IBAction func blueViewBtnTapped(_ sender: UIButton) { 20 blueViewAppeared.isActive = false 21 blueViewDisappeared.isActive = true 22 UIView.animate(withDuration: 0.4, delay: 0.0, animations: { self.contentView.layoutIfNeeded() }) 23 } 24 25 @IBAction func greenViewBtnTapped(_ sender: UIButton) { 26 blueViewDisappeared.isActive = false 27 blueViewAppeared.isActive = true 28 UIView.animate(withDuration: 0.4, delay: 0.0, animations: { self.contentView.layoutIfNeeded() }) 29 } 30}

UIViewの背景色はXIBを作る際に、Storyboard上で設定しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードの中に背景色を設定する処理がないので、おそらくStoryboardでセルのcontentViewの背景色を設定したのだと思いますが、その場合セルの並び替え移動中はcontentViewの背景色を自動的に透明にするようになっているようです。
次のようにwillDisplayのdelegateメソッドを実装して、セル自体の背景色を制御すれば、セルの並び替え移動中も色がついたままになりました。こちらの方法だとセルの右端のハンドル部分も着色されます。

swift

1 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 2 cell.backgroundColor = UIColor.blue 3 }

(12/14 回答追記)

willDisplayの中で tTableView.cellForRow(at: indexPath)を使ってセルを取得しようとしても、そのセルはまだ表示されていない(これから表示しようとしている)セルなので、cellForRowメソッドで取得できません。cellForRowメソッドはindexPath位置に表示されているセルを取得するメソッドです。

そもそも、これから表示しようとしているセルはwillDisplayの引数でcellという名前の引数に入っていますのでわざわざcellForRowで取得する必要ないです。

それと、セルの移動中はcontentViewの中の背景色は全て透明にされてしまいますので、willDisplayの中でgreenViewやblueViewに背景色をつけても結局移動中は透明にされてしまいます。

最初の回答通りですが、willDisplayの中でcontentView内のUI部品の背景色を制御するのではなく、次の通りセル自体の背景色を制御すればセルの移動中は透明でなくgreenViewと同じ色になりませんか?

swift

1 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 2 cell.backgroundColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1) 3 }

投稿2018/12/08 17:24

編集2018/12/13 16:49
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/13 02:13

回答有り難うござます、またせっかく回答頂いたのに返信が遅くなり申し訳ありませんでした。 当方の質問に不備があり、提示して頂いた回答では解決しなかったので、質問に環境の詳細を追記します。 willDisplayのなかで、カスタムセルのviewのbackgroundcolorにアクセスできれば解決するかと思い試してみたのですが、カスタムセル自体を捕まえることができませんでした。?? よろしければ、アドバイスいただきたいです。
TakeOne

2018/12/13 16:49

回答追記しました。
退会済みユーザー

退会済みユーザー

2018/12/14 18:23

回答有り難うございます。 教えていただいた方法でセル自体の背景色の制御はできました。 当方、セルの上においたUIViewなどが透過状態になるのを防ぎたいのですが、それは、ライフサイクル的に、willDisplayの中では、Cellの上に置いたUIViewにアクセスできないのでこのメソッドでは無理ということですね。 コードで設定できる方法があればと思ったのですが、並び替え時に選択されても透過されないUIObjectで構成するしか方法がないのでしょうか?
TakeOne

2018/12/15 06:43

やりたいことをやっと理解しました。 blueViewの表示によってgreenViewに貼り付けているラベルを隠すようにしているのに、セルの移動中はblueViewの背景色が透明になってしまいgreenViewのラベルが見えてしまうのをなんとかしたいということですね。 であれば、セルの移動中にContentView内の背景色を制御するのは難しいので、背景色の設定で色をつけるのではなく、blueView、greenViewそれぞれに単色画像のUIImageViewを下敷きとして貼り付ければよいと思います。
退会済みユーザー

退会済みユーザー

2018/12/16 04:28 編集

回答ありがとうございます。 教えていただいたように、imageView / UIViewなどの境界線 / UIButtonの背景画像 / UILabelのフォントなど、透明化されない部品でUIViewの中身を構成し、後ろになっているUIViewの中身が透けないようにし、並び替え処理途中に後ろ側に回るCellが透けて見えてしまう部分は、willDisplayのなかで、背景色を制御して透過しないようにしてみました。 コードで制御できないのは残念でしたが、おかげさまでうまくできたかなと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問