発生している問題・エラーメッセージ
TableViewを使用したSNSアプリを作ろうとしており、機能としてタグボタンを作っています。
カスタムcell内にカスタムビューを4つaddSubView()しています。
①ユーザーの画像と名前を表示するview
②アーティストの画像と名前、曲名を表示するView
③タグを表示するView
④良いね数を表示するView
問題が発生しているのは③です。
③には、さらにUIButtonがaddSubView()されています。
そのUIButtonのレイアウトを、カスタムView内で以下のように決めているのですが、
TableViewをスクロールすると、そのレイアウトが効かなかったり、効いたりという状況が発生してしまいます。
また、激しくスクロールすると、アプリが落ちてしまいます。
どのように解決したら良いのでしょうか、教えていただけると幸いです。
//ここでは、タグのボタンの大きさを調整しています。 func adjustSize (tag : UIButton, height: CGFloat) { //adjustBoldFontSizeForHeight(height:)は、heightに適したフォントサイズを自身に設定します。 tag.adjustBoldFontSizeForHeight(height: height) //設定されたフォントサイズ、テキストの長さをもとにtag: UIButton の横幅を決定します。 //こうすることで、UIButtonのタイトルが省略されることなく表示されます。 let attributes = [NSAttributedString.Key.font: tag.titleLabel?.font] let textWidth = tag.titleLabel!.text!.size(withAttributes: attributes).width tag.frame.size = .init(width: textWidth, height: height) }
override func layoutSubviews() { super.layoutSubviews() //tagは0~4つまで作成されます。 //ここで実現したいレイアウトは、タグ(UIButton)が親ビューの左端から順に設定されていく感じです。 //自身の横幅を超えた際に、2段目に行くようにUIButtonの高さは自身の高さの40%に設定。 //また、自身の横幅を超える可能性のある3つめからは、Bool値を使って判断しています。 let tagButtonHeight = self.frame.height * 0.4 let tagViewWidth = self.frame.width * 0.9 let margin = self.frame.width * 0.05 var previousWidth: CGFloat = 0 guard let first = firstTag else { return } adjustSize(tag: first, height: tagViewHeight) first.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true first.topAnchor.constraint(equalTo: self.topAnchor).isActive = true previousWidth += first.frame.width + margin guard let second = secondTag else { return } adjustSize(tag: second, height: tagViewHeight) second.leadingAnchor.constraint(equalTo: first.trailingAnchor, constant: margin).isActive = true second.topAnchor.constraint(equalTo: self.topAnchor).isActive = true previousWidth += second.frame.width + margin guard let third = thirdTag else { return } adjustSize(tag: third, height: tagViewHeight) if previousWidth + third.frame.width < tagViewWidth { third.leadingAnchor.constraint(equalTo: second.trailingAnchor, constant: margin).isActive = true third.topAnchor.constraint(equalTo: self.topAnchor).isActive = true previousWidth += third.frame.width + margin thirdIsOver = false } else { third.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true third.topAnchor.constraint(equalTo: self.centerYAnchor).isActive = true previousWidth += third.frame.width + margin thirdIsOver = true } guard let fourth = fourthTag else { return } adjustSize(tag: fourth, height: tagViewHeight) if thirdIsOver! { fourth.leadingAnchor.constraint(equalTo: third.trailingAnchor, constant: margin).isActive = true fourth.topAnchor.constraint(equalTo: self.centerYAnchor).isActive = true } else if previousWidth + fourth.frame.width < tagViewWidth { fourth.leadingAnchor.constraint(equalTo: third.trailingAnchor, constant: margin).isActive = true } else { fourth.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true fourth.topAnchor.constraint(equalTo: self.centerYAnchor).isActive = true } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/03 12:39
2019/12/03 13:57 編集