didSelectRowAtIndexPath ne détecte qu'une partie de la cell?

LouLou Membre
mars 2015 modifié dans API UIKit #1

Salut,


 


j'ai un tableView par dessus un autre tableView. Quand je fais un touch sur une cell, les tableView scrollent. Mais seule la moitié gauche de la cell détecte le touch, sauriez-vous pourquoi?


 


La fonction est comme ceci :



func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
maskTableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
currentIndexPath = indexPath.row
}

Seule la première cell du maskTableView est visible, ce qui permet de faire un design différent pour la première cell. Le deuxième tableView est visible à  partir de la 2e cell.


 


Je n'explique pas pourquoi toute la partie droite de ma cell ne répond pas au touch. 


La vue de la cell est un xib, qui fait 320 de large, pour tester sur l'iphone 5. Toute la cell s'affiche bien, mais le touch ne réagit pas sur la partie droite.


 


Auriez-vous une idée?


 


Merci :)


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Par-dessus ? Tu peux nous montrer une image ?
  • AliGatorAliGator Membre, Modérateur
    mars 2015 modifié #3

    un tableView par dessus un autre tableView
    [...]
    Seule la première cell du maskTableView est visible, ce qui permet de faire un design différent pour la première cell. Le deuxième tableView est visible à  partir de la 2e cell.

    Oulà , c'est quoi cette conception bizarre ?

    Pourquoi se compliquer la vie comme ça et superposer des tableview (ce qui est une idée à  la fois saugrenue et mauvaise) ? Pourquoi ne pas avoir une seule UITableView et plusieurs reuseIdentifier différents entre la première cell et les suivantes, pour avoir un design différent pour cette première cell (puisque chaque reuseIdentifier est associé à  un XIB " ou à  une classe de TableViewCell " et donc un design qui lui est propre, c'est justement fait pour...

    Il serait peut-être bon de (re)lire le TableView Programming Guide for iOS et en particulier la section "A closer look at TableView cells" qui explique comment les customiser, et aussi les sections qui parlent du concept des reuseIdentifier et de l'association d'un reuseIdentifier donné à  un XIB (avec son design spécifique et tout)...
  • LouLou Membre
    mars 2015 modifié #4

    Voilà  une image d'exemple :


     


  • AliGatorAliGator Membre, Modérateur
    Comme déjà  dit plus haut, ce n'est pas la bonne approche.
  • LouLou Membre

    Utiliser différentes cells d'accord, mais comment faire en sorte qu'il y ait un mask sur l'espace équivalent à  une cell (comme dans l'espace gris), quand on scroll?


  • AliGatorAliGator Membre, Modérateur
    Avec une UIView, soit par dessus toute ta UITableView, qui fait le masque, soit par dessus chaque UITableViewCell, qui va faire la composition de chaque cellule comme la superposition de l'état masqué et non masqué.
  • LouLou Membre

    Je ne sais pas si c'est ça dont tu parlais, mais j'ai essayé avec :


     


    un UIView avec une constraint top-44 (la height de la cell), j'ai mis un IBOutlet sur l'attribut Top de cette view, et ma fonction scroll est celle-ci :



    func scrollViewDidScroll(p_scrollView: UIScrollView) {
    if p_scrollView == tableView {
    let row = Int(CGFloat(p_scrollView.contentOffset.y) / CGFloat(heightCell))
    let ratioScroll = CGFloat(p_scrollView.contentOffset.y) / CGFloat(heightCell)
    //row 5, scroll 5.32 -> 5.32 - 5 = 0.32 -> (0.32 * 44) - 44 => value between [-44, 0]
    println("ratioScroll : \(ratioScroll)")
    let decimalOnly = ratioScroll - CGFloat(row)
    println("decimalOnly : \(decimalOnly)")

    let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row+1, inSection: 0)) as MyCell
    let scrollY : CGFloat = (CGFloat(decimalOnly) * CGFloat(heightCell)) - CGFloat(heightCell)

    println("scrollY : \(scrollY)")

    cell.constraintTopViewAbove = NSLayoutConstraint(item: cell.viewAbove, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: scrollY)

    //stop scroll if overpassed last row
    currentIndexPath = row
    if row > limitRow {
    println("stop limit \(row) > \(limitRow)")
    //both tableviews are scrolling
    tableView.setContentOffset(CGPointMake(0, CGFloat(row * heightCell)), animated: false)
    }
    //move images in scrollView
    let scrollRatio : CGFloat = CGFloat(p_scrollView.contentOffset.y) / CGFloat(44)
    scrollView.setContentOffset(CGPointMake(0, CGFloat(h)*scrollRatio), animated: false)
    }
    }

    Ce qui me donne ces logs :



    scrollY : -27.5
    ratioScroll : 1.32955
    decimalOnly : 0.329545
    scrollY : -29.5
    ratioScroll : 1.29545
    decimalOnly : 0.295455
    scrollY : -31.0
    ratioScroll : 1.26136
    decimalOnly : 0.261364
    scrollY : -32.5
    ratioScroll : 1.23864
    decimalOnly : 0.238636
    scrollY : -33.5
    ratioScroll : 1.21591
    decimalOnly : 0.215909
    scrollY : -34.5
    ratioScroll : 1.20455
    decimalOnly : 0.204545

    Mais mon "row + 1" pour trouver la cell ne fonctionne pas, quand je scroll vers le bas, la vue qui est censée descendre n'est pas visible. Quand je remonte dans le tableView, chaque cell a bien cette viewAbove avec l'attribut top à  0, ce qui fait qu'elle recouvre bien toute la cell. Mais pas quand on scroll vers le bas.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Pourquoi utilises-tu une UIScrollView ? Je ne comprend pas du tout ce que tu essaies à  faire. Comme dit Ali, c'est une conception bizarre - arrêtes-toi de montrer le code et, par contre, s'il te plaà®t nous montrer un diagramme, bien annoté.


  • LouLou Membre
    mars 2015 modifié #10

    Quand tu scrolles le tableView, les images du scrollView scrollent également. Le scrollView est en haut, le tableView en bas, les deux sont séparés. C'est l'application "sushishop" sur l'apple store.


     


    J'utilise la méthode "scrollViewDidScroll" pour le tableView également pour bloquer le scroll à  partir d'un certain nombre de cell, car je veux que la dernière cell monte jusqu'en haut du tableView, et laisser de l'espace en-dessous (les cells "emptyCell", avec 29 cells alors que j'utilise en fait que les 14 premières, simplement pour que le tableView scroll suffisamment).


     


    Dis-moi si ce n'est pas clair :)


  • J'avoue ne pas comprendre ce que tu souhaites réellement faire, même avec une image (bon, ok, j'ai pas lu le code).

    Par contre, pour essayer de comprendre pourquoi seule une partie du touch ne fonctionne, regarde peut-être du côté de l'éclatement 3D que propose XCode 6, cela te permettra peut-être de voir s'il n'y a un pas élément en rab' qui empêche le touch (ou une size d'un élément foireuse).


Connectez-vous ou Inscrivez-vous pour répondre.