Почему UICollectionView не отвечает вообще? - PullRequest
0 голосов
/ 26 апреля 2018

Я настраиваю UICollectionView внутри ViewController. Однако он не будет реагировать на любые действия пользователя, функция didSelectItemAt не вызывается, и я не могу ее прокрутить.

Я правильно установил источник данных и делегат внутри viewDidLoad(). Вот мой код:

class WelcomeController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

let padding: CGFloat = 30
var sources = [Source]()
let sourceCellId = "sourceCellId"

func fetchSources() {
    ApiSourceService.sharedInstance.fetchSources() { (root: Sources) in
        self.sources = root.source
        self.sourceCollectionView.reloadData()
    }
}

let backgroundImage: UIImageView = {
   let iv = UIImageView()
    iv.image = UIImage(named: "background")
    iv.contentMode = .scaleAspectFill
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.clipsToBounds = false
    return iv
}()

let overlayView: UIView = {
   let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .white
    return view
}()

let logo: UIImageView = {
    let iv = UIImageView()
    iv.image = UIImage(named: "mylogo")
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.clipsToBounds = false
    return iv
}()

let defaultButton: UIButton = {
    let ub = UIButton()
    ub.translatesAutoresizingMaskIntoConstraints = false
    ub.setTitle("Inloggen met E-mail", for: .normal)
    ub.setImage(UIImage(named: "envelope"), for: .normal)
    ub.imageEdgeInsets = UIEdgeInsetsMake(15, 0, 15, 0)
    ub.imageView?.contentMode = .scaleAspectFit
    ub.contentHorizontalAlignment = .left
    ub.titleLabel?.font = UIFont.init(name: "Raleway-Regular", size: 16)
    ub.backgroundColor = .cuOrange
    return ub
}()

let continueWithoutButton: UIButton = {
    let ub = UIButton()
    ub.translatesAutoresizingMaskIntoConstraints = false

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: "Doorgaan zonder in te loggen")
    let textRange = NSMakeRange(0, attributedString.length)
    attributedString.setColor(color: .cuOrange, forText: "Doorgaan")
    ub.setAttributedTitle(attributedString, for: .normal)

    ub.contentHorizontalAlignment = .center
    ub.titleLabel?.font = UIFont.init(name: "Raleway-Regular", size: 16)
    ub.titleLabel?.textColor = .white
    return ub
}()


let sourceCollectionView: UICollectionView = {
   let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
    cv.translatesAutoresizingMaskIntoConstraints = false
    cv.backgroundColor = .white
    return cv
}()



let termsButton: UIButton = {
    let ub = UIButton()
    ub.translatesAutoresizingMaskIntoConstraints = false

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: "Met het maken van een account \nof bij inloggen, ga ik akkoord \nmet servicevoorwaarden.")
    let textRange = NSMakeRange(0, attributedString.length)
    attributedString.setColor(color: .cuOrange, forText: "servicevoorwaarden")
    ub.setAttributedTitle(attributedString, for: .normal)

    ub.contentHorizontalAlignment = .center
    ub.contentVerticalAlignment = .bottom
    ub.titleLabel?.lineBreakMode = .byWordWrapping
    ub.titleLabel?.font = UIFont.init(name: "Raleway-Regular", size: 14)
    ub.titleLabel?.textColor = .white
    ub.titleLabel?.textAlignment = .center
    return ub
}()

override func viewDidLoad() {
    super.viewDidLoad()

    fetchSources()

    sourceCollectionView.dataSource = self
    sourceCollectionView.delegate = self
    sourceCollectionView.register(SourceCell.self, forCellWithReuseIdentifier: sourceCellId)

    view.addSubview(backgroundImage)
    view.addSubview(overlayView)
    backgroundImage.addSubview(termsButton)
    backgroundImage.addSubview(logo)
    backgroundImage.addSubview(sourceCollectionView)

    backgroundImage.widthAnchor.constraint(lessThanOrEqualToConstant: 375).isActive = true
    backgroundImage.heightAnchor.constraint(lessThanOrEqualToConstant: 667).isActive = true
    backgroundImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    backgroundImage.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true



    logo.centerXAnchor.constraint(equalTo: backgroundImage.centerXAnchor).isActive = true
    logo.topAnchor.constraint(equalTo: backgroundImage.topAnchor, constant: padding).isActive = true
    logo.widthAnchor.constraint(equalToConstant: 107).isActive = true
    logo.heightAnchor.constraint(equalToConstant: 100).isActive = true

    sourceCollectionView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    sourceCollectionView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -(padding*1.5)).isActive = true
    sourceCollectionView.topAnchor.constraint(equalTo: logo.bottomAnchor, constant: padding).isActive = true
    sourceCollectionView.bottomAnchor.constraint(equalTo: termsButton.topAnchor, constant: -(padding*2)).isActive = true

    termsButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -padding).isActive = true
    termsButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    termsButton.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -(padding*2)).isActive = true
    termsButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

    sourceCollectionView.reloadData()

}

@objc func closeWelcomeController() {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.switchViewControllers()

    self.dismiss(animated: true, completion: {

    })

}


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

    let width = self.sourceCollectionView.frame.width
    let height = CGFloat(50)

    return CGSize(width: width, height: height)

}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return sources.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    print(sources[indexPath.item].feed_name)

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: sourceCellId, for: indexPath) as! SourceCell
    cell.preservesSuperviewLayoutMargins = true
    cell.source = sources[indexPath.item]

    return cell

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print("selecting")
}}

Кто-нибудь знает, что я здесь не так делаю?

Я надеюсь, что в коде есть не просто "глупая" ошибка, почему она не работает, но она пожирает мой мозг в течение последних нескольких часов.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Я вижу, вы добавляете sourceCollectionView в subview backgroundImage. Ваш backgroundImage - UIImageView, поэтому UIImageView не взаимодействует с пользователем, за исключением того, что вам нужно его включить. Проблема вашего кода

backgroundImage.addSubview(sourceCollectionView)

Для моего предложения вы должны создать UIView или другие представления, которые могут взаимодействовать с взаимодействием с пользователем. Это будет работать нормально.

0 голосов
/ 26 апреля 2018

Кажется, что неуместно добавлять sourceCollectionView в качестве подпредставления в backgroundImage, что UIImageView!Логически, представление изображения не представляет контейнерное представление (такое как UIView UIStackView, UIScrollView), т.е. даже если код позволяет вам сделать это, оно все еще не имеет смысла;Кроме того, даже если добавление подпредставления к просмотру изображения является нормальным (что составляет , а не ), представления изображений по умолчанию отключены для взаимодействия с пользователем (userInteractionEnabled по умолчанию falseпредставления изображений), поэтому вы даже не можете прокрутить представление коллекции, оно является частью (подпредставлением) отключенного компонента взаимодействия с пользователем.

В вашем viewDidLoad() вы реализуете:

backgroundImage.addSubview(termsButton)
backgroundImage.addSubview(logo)
backgroundImage.addSubview(sourceCollectionView)

Не делайте этого, вместо этого добавьте их к основному виду контроллера представления:

view.addSubview(termsButton)
view.addSubview(logo)
view.addSubview(sourceCollectionView)

Для проверки, по крайней мере, причина проблемысделать это для представления коллекции (view.addSubview(sourceCollectionView)).

И для организации иерархии представления (которое находится поверх другого), вы можете использовать оба: bringSubview(toFront:) или sendSubview(toBack:).Например, после добавления представления коллекции в view может потребоваться:

view.bringSubview(toFront: sourceCollectionView)

, чтобы убедиться, что представление коллекции находится поверх всех компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...