modo da avere una UIView
all'interno di un UIScrollView
, ma volete che il vostro UIView
di avere molto grandi limiti (cioè, in modo che corrisponda alle dimensioni di S' contentSize
tuoi UIScrollView
). Ma non vuoi disegnare l'intero UIView
ogni volta che deve essere visualizzato, né puoi adattare l'intero contenuto alla memoria in una sola volta.
Fai la tua UIView
utilizza un supporto CAScrollLayer
, come segue:
// MyCustomUIView.m
+ (Class) layerClass
{
return [CAScrollLayer class];
}
aggiungere un metodo per aggiornare la posizione di scorrimento quando l'utente scorre il UIScrollView
contenente il UIView
:
// MyCustomUIView.m
- (void) setScrollOffset:(CGPoint)scrollOffset
{
CAScrollLayer *scrollLayer = (CAScrollLayer*)self.layer;
[scrollLayer scrollToPoint:scrollOffset];
}
Assicurarsi che quando disegni il tuo UIView
, disegna solo le parti contenute nello CGRect
a te fornite:
- (void)drawRect:(CGRect)rect
{
// Only draw stuff that lies inside 'rect'
// CGRectIntersection might be handy here!
}
Ora, nella vostra UIScrollViewDelegate
, è necessario informare il CAScrollLayer
vista sostenuta quando gli aggiornamenti genitore UIScrollView
:
// SomeUIScrollViewDelegate.m
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
// Offset myCustomView within the scrollview so that it is always visible
myCustomView.frame = CGRectMake(scrollView.contentOffset.x,
scrollView.contentOffset.y,
scrollView.bounds.size.width,
scrollView.bounds.size.height);
// "Scroll" myCustomView so that the correct portion is rendered
[myCustomView setScrollOffset:self.contentOffset];
// Tell it to update its display
[myCustomView setNeedsDisplay];
}
È anche possibile utilizzare CATiledLayer
, che è più facile perché non c'è bisogno di traccia la posizione di scorrimento - invece il tuo metodo drawRect
verrà chiamato con ogni tessera come necessario. Tuttavia questo farà sì che la tua vista sbiadisca lentamente. Potrebbe essere utile se intendi memorizzare nella cache parti della tua vista e non preoccuparti dei lenti aggiornamenti.