2017-05-19 17 views
0

私はこの奇妙な問題に少し戸惑っており、それを理解できないようです。UICollectionViewで水平スクロールでセルが消えています

セットアップ

  • は SはAのUICollectionViewCell S
  • Cの場合、ユーザタップBのサブビューとして追加UICollectionViewであるUICollectionView

  • BでありますB内

    +------------------------------+ 
    |A        | 
    |        | 
    | +----------+ +----------+ | 
    | |B   | |B   | | 
    | |----------| |   | | 
    | |   | |   | | 
    | |C   | |   | | 
    | +----------+ +----------+ | 
    +------------------------------+ 
    

問題

.horizontalにCのUICollectionViewFlowLayoutスクロール方向プロパティを初期化し、及び第二の細胞過ぎてスクロールし、Cの細胞が消失しています。

C自体がUIから消滅しています。ユーザは再びセルをタップすることができ、Cの通常の削除で実行されたすべての処理が実行されます。もう一度タップすると正常に表示されますが、Cの表示でトリガーされたアクションは実行されますが、Cはまだ視覚的にどこにも見つかりません。

スクロール方向を.verticalに設定しても問題は発生しません。

ここで起こっていることと同様の問題やヒントを誰かが見つけましたか?

ありがとうございます。


EDIT実際の実装

(B)

import UIKit 

class CollectionViewCell: UICollectionViewCell { 

    //... 

    private let cellId = "cellId" 

    private lazy var label: UILabel = { 

     return CollectionViewCell._label() 
    }() 

    fileprivate lazy var gallery: UICollectionView = { 

     return CollectionViewCell._gallery() 
    }() 

    //... 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     isOpaque = true 
     clipsToBounds = true 
     layer.borderWidth = 1.5 
     layer.cornerRadius = 8 

     // ... 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    private func onSwitchDisplayGallery(_ isDiplaying: Bool) { 

     switch isDiplaying { 

     case true: 

      addSubview(label) 
      label.topAnchor.constraint(equalTo: topAnchor).isActive = true 
      label.leftAnchor.constraint(equalTo: leftAnchor).isActive = true 
      label.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 
      label.heightAnchor.constraint(equalToConstant: frame.height/5.25).isActive = true 

      gallery.register(NestedCollectionViewCell.self, forCellWithReuseIdentifier: cellId) 
      gallery.delegate = self 
      addSubview(gallery) 
      gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true 
      gallery.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 
      gallery.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 
      gallery.heightAnchor.constraint(equalTo: heightAnchor, constant: -frame.height/5.25).isActive = true 

     case false: 

      print("removed cv") 
      // ... 
     } 
    } 

    //... 
} 

extension CollectionViewCell: UICollectionViewDelegateFlowLayout { 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

     return gallery.frame.size 
    } 
} 


private extension CollectionViewCell { 

    class func _gallery() -> UICollectionView { 

     let layout = UICollectionViewFlowLayout() 

     layout.minimumInteritemSpacing = 0 
     layout.minimumLineSpacing = 0 
     layout.scrollDirection = .horizontal 

     let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 

     cv.isPagingEnabled = true 
     cv.showsHorizontalScrollIndicator = false 
     cv.translatesAutoresizingMaskIntoConstraints = false 
     return cv 
    } 

    class func _label() -> UILabel { 

     let label = UILabel() 

     label.font = UIFont(name: "Montserrat-Regular", size: 15) 
     label.textColor = .white 
     label.translatesAutoresizingMaskIntoConstraints = false 
     return label 
    } 
} 

(C)

import UIKit 

class NestedCollectionViewCell: UICollectionViewCell { 

    private let containerView = NestedCollectionViewCell._containerView() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     isOpaque = true 
     clipsToBounds = true 
     backgroundColor = .white 

     addSubview(containerView) 
     containerView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 
     containerView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true 
     containerView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true 
     containerView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true 

     //... 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

private extension NestedCollectionViewCell { 

    class func _containerView() -> UIImageView { 

     let view = UIImageView() 

     view.contentMode = .scaleAspectFill 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    } 
} 

EDIT 2 ニックの回答hereを試しました。

スクロール方向を.verticalに設定すると、すべて正常です。それは.horizontal Cディスプレイなしのセルに設定されている

...

+0

コードを表示できますか?アンカーを使用していますか?あなたはストーリーボードを使いましたか? – kbunarjo

+0

@kbunarjo:すべてがプログラムでアンカーで実行されます。実装による編集済みの回答を参照してください。 – Herakleis

答えて

0

愚かな、愚かな新人のミス。他の誰かが私のように眼鏡が必要な場合はここに残してください:)

コレクションビューには水平方向の拘束がありませんでした...

addSubview(gallery) 
gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true 
gallery.leftAnchor.constraint(equalTo: leftAnchor).isActive = true 

にこれを修正

addSubview(gallery) 
gallery.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true 
gallery.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 

は(明らかに)それを修正しました。

関連する問題