Vì vậy, bạn có một UIView
bên trong một UIScrollView
, nhưng bạn muốn bạn UIView
có giới hạn rất lớn (ví dụ, vì vậy nó phù hợp với kích thước của UIScrollView
's contentSize
của bạn). Nhưng bạn không muốn vẽ toàn bộ UIView
mỗi khi cần hiển thị hoặc bạn cũng không thể vừa với toàn bộ nội dung của nó trong bộ nhớ cùng một lúc.
Hãy UIView
của bạn sử dụng một sự ủng hộ CAScrollLayer
, như sau:
// MyCustomUIView.m
+ (Class) layerClass
{
return [CAScrollLayer class];
}
Thêm một phương pháp để cập nhật vị trí cuộn khi người dùng cuộn các UIScrollView
chứa của bạn UIView
:
// MyCustomUIView.m
- (void) setScrollOffset:(CGPoint)scrollOffset
{
CAScrollLayer *scrollLayer = (CAScrollLayer*)self.layer;
[scrollLayer scrollToPoint:scrollOffset];
}
Đảm bảo rằng khi bạn vẽ UIView
, bạn chỉ vẽ các phần có trong số CGRect
được cung cấp cho bạn:
- (void)drawRect:(CGRect)rect
{
// Only draw stuff that lies inside 'rect'
// CGRectIntersection might be handy here!
}
Bây giờ, trong UIScrollViewDelegate
của bạn, bạn sẽ cần phải thông báo CAScrollLayer
xem ủng hộ của bạn khi phụ huynh UIScrollView
cập nhật:
// 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];
}
Bạn cũng có thể sử dụng CATiledLayer
, đó là dễ dàng hơn vì bạn không cần phải theo dõi vị trí cuộn - thay vào đó, phương thức drawRect
của bạn sẽ được gọi với mỗi ô khi cần. Tuy nhiên, điều này sẽ làm cho chế độ xem của bạn mờ dần. Nó có thể là mong muốn nếu bạn có ý định bộ nhớ cache các phần của quan điểm của bạn và không nhớ các bản cập nhật chậm.