J'ai une vue étrange qui apparaît dans ma sous-classe UICollectionViewCell avec une structure simple de 2 imageViews et 1 bouton.

final class ProfileImageCell:UICollectionViewCell {
    static var name: String { return "ProfileImageCell" }
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var anotherImageView: UIImageView!
    func setup(...) { ... } 
    @IBAction func buttonAction(_ sender: UIButton) { ... }
}

Dans la méthode setup (), j'ai configuré imageViews et je transmets quelques propriétés. Je ne crée aucune vue ni ne modifie les sous-vues personnelles

Ensuite, dans mon viewcontroller, je configure collectionView comme d'habitude.

collectionView.register(UINib(nibName: ProfileImageCell.name, bundle: nil), forCellWithReuseIdentifier: ProfileImageCell.name)

ProfileImageCell.xib

xib structure

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ProfileImageCell.name, for: indexPath) as! ProfileImageCell
    cell.setup(...)
    return cell
}

C'est alors que des choses étranges se produisent. J'obtiens 4 sous-vues dans ma cellule. Même si j'arrête l'exécution juste après avoir appelé:

(lldb) po cell.subviews
▿ 4 elements
  - 0 : <UIImageView: 0x1026bac00; frame = (0 0; 375 667); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x170236dc0>>
  - 1 : <UIImageView: 0x1026bade0; frame = (263 0; 112 112); autoresize = RM+BM; layer = <CALayer: 0x170237160>>
  - 2 : <UIButton: 0x1026ba4d0; frame = (263 0; 112 112); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x170237140>>
  - 3 : <UIView: 0x102732cb0; frame = (0 0; 600 600); gestureRecognizers = <NSArray: 0x17444e430>; layer = <CALayer: 0x174238aa0>>

Quelqu'un a une idée de l'origine de cet UIView ? Il a un cadre étrange (qui ne change pas après l'apparition de la cellule à l'écran), couvrant toute ma cellule et ne laissant aucun geste jusqu'au bouton. Aussi, très intéressant, pourquoi a-t-il un outil de reconnaissance de gestes?

(lldb) po cell.subviews[3].gestureRecognizers?.first?.description
▿ Optional<String>
  - some : "<UILongPressGestureRecognizer: 0x10271db10; state = Possible; view = <UIView 0x102732cb0>; target= <(action=_handleMenuGesture:, target=<Application.ProfileImageCell 0x1026ba790>)>>"
1
Yaroslav 16 janv. 2017 à 19:56

2 réponses

Meilleure réponse

C'est le contentView de la cellule - voir la documentation.

Vos sous-vues doivent être ajoutées au contentView plutôt qu'à la cellule directement, où elles se trouvent actuellement. Cela s'est produit parce que votre pointe est un simple UIView qui ne contient pas la propriété contentView.

Ce que vous devez faire est de concevoir votre pointe avec un objet UICollectionViewCell, en faisant simplement glisser l'objet approprié dans le générateur d'interface:

image

4
xoudini 16 janv. 2017 à 17:33

Créez une cellule de vue UICollectiontion avec un fichier XIB. Vous ne pouvez pas faire glisser et déposer un UICollectionViewCell dans un XIB lorsqu'il a été créé en tant que UIView. Nouvelle cellule de visualisation de la collection d'arrivée est un XIB mais son type est UICollectionViewCell. Dans la deuxième image, Product Collection View Cell est également XIB utilisé comme UICollectionViewCell mais son type est UIView. Les deux sont créés de deux manières.

Cas 1: il n'y a pas d'UIView devant notre UICollectionViewCell

Cas 2: il y a UIView devant notre UICollectionViewCell

Assurez-vous que votre XIB n'est pas un UIView.

enter image description here

enter image description here

0
Bibin Jaimon 23 août 2018 à 06:30