Ho implementato un controllo di aggiornamento personalizzato (la mia classe, non una sottoclasse) e per qualche motivo dal passaggio a iOS 8, impostando contentInset della vista di scorrimento (in particolare, UICollectionView) per avviare la l'animazione di rinfresco provoca uno strano salto/balbuzie. Qui è il mio codice:Animazione di UIScrollView contentInset causa il salto balbuzie
- (void)containingScrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat scrollPosition = scrollView.contentOffset.y + scrollView.contentInset.top;
if(scrollPosition > 0 || self.isRefreshing)
{
return;
}
CGFloat percentWidth = fabs(scrollPosition)/self.frame.size.height/2;
CGRect maskFrame = self.maskLayer.frame;
maskFrame.size.width = self.imageLayer.frame.size.width * percentWidth;
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
self.maskLayer.frame = maskFrame;
[CATransaction commit];
}
- (void)containingScrollViewDidEndDragging:(UIScrollView *)scrollView
{
if((self.maskLayer.frame.size.width >= self.imageLayer.frame.size.width) && !self.isRefreshing)
{
self.isRefreshing = YES;
[self setLoadingScrollViewInsets:scrollView];
[self startAnimation];
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
}
- (void)setLoadingScrollViewInsets:(UIScrollView *)scrollView
{
UIEdgeInsets loadingInset = scrollView.contentInset;
loadingInset.top += self.frame.size.height;
UIViewAnimationOptions options = UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState;
[UIView animateWithDuration:0.2 delay:0 options:options animations:^
{
scrollView.contentInset = loadingInset;
}
completion:nil];
}
In sostanza, una volta l'utente rilascia per aggiornare, mi animano il contentInset all'altezza del controllo di aggiornamento. Immagino che l'animazione ridurrebbe la balbuzie/balbuzie, cosa che ha fatto in iOS 7. Ma in iOS 8, quando la scrollView viene rilasciata dal trascinamento, invece di animare semplicemente a contentInset, il contenuto della vista di scorrimento salta giù dal punto di rilascio in realtà rapidamente, e poi si anima senza intoppi. Non sono sicuro se si tratta di un bug in iOS 8 o cosa. Ho anche provato ad aggiungere:
scrollView.contentOffset = CGPointZero;
nel blocco di animazione, che non ha cambiato nulla.
Qualcuno ha qualche idea? Qualsiasi aiuto sarebbe molto apprezzato. Grazie!
Ha funzionato per me! Sei forte. Grazie per averlo inserito qui. – boztalay
Hai ragione, questo risolve il problema. Sembra che l'animazione del contentInset da solo causi un'interferenza dell'animazione con l'animazione di decelerazione, motivo per cui appare un "salto". Compreso il contentOffset avvia l'animazione dalla posizione corrente. –
L'inclusione del contenuto nell'animazione sembra abbastanza difficile da indovinare. Come l'hai capito? – Tudorizer