para que tenga una UIView
dentro de un UIScrollView
, pero usted quiere que su UIView
que tienen muy anfiteatro (es decir, para que coincida con el tamaño de sus UIScrollView
's contentSize
). Pero no desea dibujar el UIView
completo cada vez que necesita mostrarlo, ni puede ajustar todo su contenido en la memoria a la vez.
Haga su UIView
utiliza un respaldo CAScrollLayer
, de la siguiente manera:
// MyCustomUIView.m
+ (Class) layerClass
{
return [CAScrollLayer class];
}
añadir un método para actualizar la posición de desplazamiento cuando el usuario desplaza el UIScrollView
que contiene su UIView
:
// MyCustomUIView.m
- (void) setScrollOffset:(CGPoint)scrollOffset
{
CAScrollLayer *scrollLayer = (CAScrollLayer*)self.layer;
[scrollLayer scrollToPoint:scrollOffset];
}
asegurar que cuando Si dibuja su UIView
, solo dibujará las partes que figuran en el CGRect
que le proporcionó:
- (void)drawRect:(CGRect)rect
{
// Only draw stuff that lies inside 'rect'
// CGRectIntersection might be handy here!
}
Ahora, en su UIScrollViewDelegate
, tendrá que notificar a su CAScrollLayer
vista respaldado cuando los padres UIScrollView
actualizaciones:
// 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];
}
También se pueden utilizar CATiledLayer
, que es más fácil porque usted no tiene que rastrear la posición de desplazamiento; en su lugar, se llamará a su método drawRect
con cada panel según sea necesario. Sin embargo, esto hará que su vista se desvanezca lentamente. Puede ser deseable si tiene la intención de almacenar en caché partes de su vista y no le importa las actualizaciones lentas.