2015-09-19 21 views
10

Link to the subclass of UITableViewCome eseguire gli aggiornamenti su UITableView mentre si scorre usando CADisplayLink e UITableViewAutomaticDimension senza saltare?

Perché UITableView salta durante lo scorrimento? Puoi aiutarmi?

per chi mi aiuta comincio e premio in seguito ALTRO taglia di 100 :-)

come eseguire alcuni cambiamenti sulla UITableView insieme con la sua impostazione contentOffset?

Ecco come ho impostato il mio scrollDisplayLink:

scrollDisplayLink = CADisplayLink(target: self, selector: Selector("scrollTable")) 
scrollDisplayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) 
cellForCurrentIndexPath?.hidden = true 

, quindi entro scrollTable Io seguenti cose:

func scrollTable() { 
    var newOffset = CGPointMake(currentContentOffset.x, currentContentOffset.y + scrollRate * 10) 

    if currentContentSize.height < frame.size.height { 
     newOffset = currentContentOffset 
    } else if newOffset.y > currentContentSize.height - frame.size.height { 
     newOffset.y = currentContentSize.height - frame.size.height 
    } else if newOffset.y < 0 { 
     newOffset = CGPointZero 
    } 

    contentOffset = newOffset 


    if coveredIndexPath != nil && coveredIndexPath! != currentIndexPath! { 

     let verticalPositionInCoveredCell = longPressGestureRecognizer.locationInView(cellForRowAtIndexPath(coveredIndexPath!)).y 

     if direction == .Down && heightForCoveredCell - verticalPositionInCoveredCell <= heightForCurrentCell/2 { 
       print("moved down") 

       beginUpdates() //1 
       moveRowAtIndexPath(currentIndexPath!, toIndexPath: coveredIndexPath!) //2 
       currentIndexPath = coveredIndexPath //3 
       endUpdates() //4 

     } 
    } 
} 

scorrimento è bene a meno linee 1-4 sono commentate o disattivo UITableViewAutomaticDimension. Quando non vengono commentati, la tabella salta quando currentContentOffset è diverso da 0 durante lo scorrimento. Perché succede così? È un problema con discussioni o qualcos'altro?

NOTA:

UITableView lavora con UITableViewAutomaticDimension:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

risposta

0

Cominciamo con l'ovvio:

UITableView è una sottoclasse di UIScrollView e possiamo utilizzare alcune proprietà di questo.

Quasi ogni anno c'è un eccellente discorso sul WWDC su come personalizzare UIScrollviews.

Essi suggeriscono di fare le cose come si fa all'interno

// is called every frame of scrolling and zooming 
override func layoutSubviews() { 
    ... 
    super.layoutSubviews() 
    ... 
} 

che è chiamato ogni fotogramma mentre l'utente sta scorrendo.

Ho usato questo posto pesantemente per scherzare con currentContentOffset e dimensionare e coordinare i sistemi durante lo scorrimento (ho sottoclasse UIScrollView e non UITableView).

Vantaggi:

  • si ottiene tuoi callback ogni fotogramma gratuitamente, senza bisogno di usare CADisplayLink
  • si stanno cambiando le cose Tike contentOffset esattamente quando l'UIScrollView si aspetta di essere cambiato.

Spero che questo aiuti

P.S.

in base ai miei esperimenti, la vista che scorre all'interno di un UIScrollView non può essere superiore a circa 8000 pixel.

Così Mele UITableView deve attuare una strategia che si chiama scrolling infinito ed è descritto in uno dei video WWDC su UIScrollViews:

in breve:

una frazione del tavolo è disegnato una volta e poi Scorri senza ridisegnare il contenuto della tabella. Quando l'utente scorre troppo lontano, viene disegnata una parte diversa della tabella a scorrimento e allo stesso tempo contentOffset viene modificato dall'implementazione di UITableView.

Questo è probabilmente fatto quando chiamate super.layoutSubviews() nella vostra implementazione di layoutSubviews().