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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

3882閲覧

collectionViewで無限スクロールを実装する際、セル内のラベルにテキストがきちんと入らない

KazutakaShimizu

総合スコア157

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2017/06/13 02:06

編集2017/06/14 22:30

現在iosアプリを作っており、collectionViewを使った無限にスクロールできるメニューを実装しようとしています(メルカリのカテゴリメニューのようなものです)
collectionViewのセル一つ一つがメニューとなっていて
ここにメニューのタイトルを入れようとすると下記のようにうまく表示されません。
イメージ説明

swift

1//メニュー部分全体のView 2class MenuBarView: UIView { 3 var pageTabItemsWidth: CGFloat = 0.0 4 var collectionView:UICollectionView! 5 var titles: [String] = Constant.menuTitle 6 override init(frame: CGRect) { 7 super.init(frame: frame) 8 setUpCollectionView() 9 } 10 ![ 11 12文字列ではなくセルの背景色をセルごとに変えようとするとうまくいきます。 13ソースコードは下記](358ec05119a0e16055670e7bdfef2f88.gif) 14 required init?(coder aDecoder: NSCoder) { 15 fatalError("init(coder:) has not been implemented") 16 } 17} 18 19extension MenuBarView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 20 fileprivate func setUpCollectionView(){ 21 let layout = UICollectionViewFlowLayout() 22 layout.itemSize = CGSize(width:100, height:30) 23 layout.scrollDirection = .horizontal 24 collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height), collectionViewLayout: layout) 25 // Cellに使われるクラスを登録. 26 collectionView.delegate = self 27 collectionView.dataSource = self 28 collectionView.showsHorizontalScrollIndicator = false 29 collectionView.register(MenuBarViewCell.self, forCellWithReuseIdentifier: "MyCell") 30 self.addSubview(collectionView) 31 32 } 33 34 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 35 print("items") 36 return titles.count * 3 37 } 38 39 /* 40 Cellに値を設定する 41 */ 42 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 43 let cell : MenuBarViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell",for: indexPath) as! MenuBarViewCell 44 configureCell(cell: cell, indexPath: indexPath) 45 return cell 46 } 47 48 private func configureCell(cell:MenuBarViewCell, indexPath: IndexPath){ 49 let fixedIndex = indexPath.item % titles.count 50 cell.title = titles[fixedIndex] 51 } 52} 53 54extension MenuBarView: UIScrollViewDelegate { 55 func scrollViewDidScroll(_ scrollView: UIScrollView) { 56 if pageTabItemsWidth == 0.0 { 57 pageTabItemsWidth = floor(scrollView.contentSize.width / 3.0) // 表示したい要素群のwidthを計算 58 } 59 60 if (scrollView.contentOffset.x <= 0.0) || (scrollView.contentOffset.x > pageTabItemsWidth * 2.0) { // スクロールした位置がしきい値を超えたら中央に戻す 61 scrollView.contentOffset.x = pageTabItemsWidth 62 } 63 } 64}

swift

1//MenuBarViewで表示しているcollectionViewCell 2class MenuBarViewCell: UICollectionViewCell { 3 var title:String!{ 4 didSet{ 5 setUpUi() 6 } 7 } 8 9 override func awakeFromNib() { 10 super.awakeFromNib() 11 } 12 13 private func setUpUi(){ 14 self.backgroundColor = .white 15 var label = UILabel(frame: self.bounds) 16 label.text = title 17 label.textColor = .black 18 label.textAlignment = .center 19 self.contentView.addSubview(label) 20 } 21}

足りてない情報等ございましたら、お手数ですがコメントをください。
どんたか教えていただけると大変助かります。よろしくお願い申し上げます。

【追記】
MenuBarViewCellのsetUpUi()内のUILabel(frame: self.frame)部分の記述を
UILabel(frame: self.bounds)に切り替えたところ表示はされるが
素早くスクロールすると一つのセルの中に複数のメニューのタイトルが重なって表示されてしまうようになりました。
イメージ説明

【解決方法】
MenuBarViewCellの記述を下記のようにして、addSubViewが呼び出されるのを一度だけにしたところなおりました。

swift

1class MenuBarViewCell: UICollectionViewCell { 2 var isCompletedSetUpUI: Bool = false 3 var title:String!{ 4 didSet{ 5 if !isCompletedSetUpUI { 6 setUpUi() 7 } 8 } 9 } 10 11 override func awakeFromNib() { 12 super.awakeFromNib() 13 } 14 15 private func setUpUi(){ 16 self.backgroundColor = .white 17 var label = UILabel(frame: self.bounds) 18 print(title) 19 label.text = title 20 label.textAlignment = .center 21 self.contentView.addSubview(label) 22 isCompletedSetUpUI = true 23 } 24}

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

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

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

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

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

fuzzball

2017/06/13 06:50

MenuBarViewCellのlabelはStoryboard上で乗せているのではないのでしょうか?
KazutakaShimizu

2017/06/13 06:54 編集

申し訳ございません 先ほど修正いたしまして、現在はStoryBoardもXibも使わず、labelをソースコードから生成して乗せています
fuzzball

2017/06/13 07:02

なぜStoryboard(xib)をやめたのか謎ですが‥。それはそれとして、現在のコードだとsetUpUi()が呼ばれるたびにUILabelが積み重なっていきます。(私の回答でaddSubviewを削除するように書いたのはそのためです)
KazutakaShimizu

2017/06/14 22:31

MenuBarViewCellの記述を下記のようにして、addSubViewが呼び出されるのを一度だけにしたところなおりました。アドバイスありがとうございました。
guest

回答2

0

ベストアンサー

setUpUi()内のUILabel(frame: self.frame)が問題なんだと思います。
self.frameを指定するとセルの位置に影響されてしまうので、最初のセル以外はセルをはみ出て配置されてしまっているため表示されなくなっているのかと思います。

解決策としてはUILabel(frame: self.bounds)なんかを指定すればとりあえず表示されるようになるのではないでしょうか。

質問とは関係ない指摘

  • UICollectionView はコードで生成しているので MenuBarViewCell の @IBOutlet は不要
  • setUpUi()が呼ばれるたびに毎回ラベル生成されているので、初期化と一緒に生成するかifで囲うかする

投稿2017/06/13 06:07

u39ueda

総合スコア950

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

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

0

MenuBarViewCellの、

swift

1label = UILabel(frame: self.frame)

これだとOutletで繋いだUILabelではなく、新規にインスタンスを作成することになりますので削除して下さい。

swift

1self.contentView.addSubview(label)

これも不要です。

質問の症状とは関係ないような気もしますが、とりあえず。

投稿2017/06/13 02:17

編集2017/06/13 05:46
fuzzball

総合スコア16731

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

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

KazutakaShimizu

2017/06/13 03:10

セルの幅を可変にしたり、メニューに入れる文字列を一桁の数字などにしたのですが、改善されません・・・。
fuzzball

2017/06/13 03:51

画像がガクガクして分かりづらいのですが、テキストが途切れるという問題ではないのでしょうか? 「きちんと入らない」とか「うまく表示されません」ではなく、もう少し具体的に書いて下さい。
KazutakaShimizu

2017/06/13 05:16

スクロールするたびにテキストが入ったり入らなかったり、一つのセルに二つのテキストが重なって入ってしまったりします。 画像を変更いたしましたので、改めてご確認いただけると幸いです。
fuzzball

2017/06/13 05:46

回答を更新しました。
KazutakaShimizu

2017/06/13 05:52 編集

ありがとうございます。 ご指摘いただいたところを修正いたしましたが、おっしゃるとおり症状とは無関係の部分だったようです。
fuzzball

2017/06/13 06:03

UICollectionViewのスクロール制御と、scrollViewDidScroll内のスクロール制御が干渉してないですかね?UICollectionViewを使う必要性も感じないので、UIScrollViewnの上にUILabelを並べた方が良いのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問