2012-05-01 32 views
6

Tôi đang tạo một ứng dụng iPhone có hình ảnh toàn cảnh 360 độ lớn. Bức tranh toàn cảnh là một CATiledLayer trong một UIScrollView.Cuộn vô hạn - setContentOffset: dừng giảm tốc độ UIScrollView

Tôi đang cố gắng triển khai cuộn vô hạn trên hình ảnh (chỉ theo chiều ngang). Tôi đã làm điều này bằng cách phân lớp UIScrollView và triển khai setContentOffset: và setContentOffset: animated: và nó hoạt động hoàn hảo khi người dùng đang kéo scrollview. Tuy nhiên, khi người dùng đã nhấc ngón tay lên và chế độ xem cuộn xuống đang giảm tốc, việc thay đổi contentOffset làm giảm tốc độ dừng ngay lập tức.

- (void)setContentOffset:(CGPoint)contentOffset 
{  
    CGPoint tempContentOffset = contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     tempContentOffset = CGPointMake(1, tempContentOffset.y); 
    } 
    else if ((int)tempContentOffset.x <= 0) 
    { 
     tempContentOffset = CGPointMake(5113, tempContentOffset.y); 
    } 

    [super setContentOffset:tempContentOffset];  
} 

Có cách nào để thay đổi contentOffset mà không ảnh hưởng giảm tốc?

Đã được đề xuất here ghi đè setContentOffset: (không setContentOffset: animated :) khắc phục vấn đề này, nhưng dường như tôi không làm được.

Tôi cũng đã thử scrollRectToVisible: hoạt ảnh: không thành công.

Bất kỳ ý tưởng nào về cách khắc phục sự cố này sẽ được đánh giá rất nhiều. Cảm ơn!

EDIT:

Mã cho scrollViewDidScroll:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset]; 
} 

Tôi cũng đã cố gắng này:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    CGPoint tempContentOffset = panoramaScrollView.contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y); 
    } 
    else if ((int)tempContentOffset.x == 0) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y); 
    } 
} 

Trả lời

2

tôi giải quyết vấn đề với một cách giải quyết. Tôi đã tạo một ảnh toàn cảnh với 3 chiều rộng toàn cảnh của ảnh toàn cảnh (không ảnh hưởng đến hiệu suất quá nhiều vì tôi đang sử dụng CATiledLayer) và đặt thuộc tính decelerationRate thành UIScrollViewDecelerationFast. Do đó, người dùng không thể cuộn quá xa trước khi giảm tốc dừng và nếu giảm tốc dừng ở hình ảnh toàn cảnh bên trái hoặc bên phải, thì bù đắp nội dung sau đó được thay đổi trở lại hình ảnh ở giữa. Điều này có sự xuất hiện của cuộn vô hạn, và đó là giải pháp tốt nhất tôi có thể đưa ra.

+0

Để tránh nhu cầu 'UIScrollViewDecelerationFast', bạn có thể làm cho' contentSize' rất lớn, bắt đầu với chế độ xem nội dung ba chiều và điểm quan sát ở giữa, và sắp xếp cho chế độ xem nội dung đó để được định vị lại trong khi cuộn; sau đó, khi giảm tốc dừng lại, đặt mọi thứ trở lại ở giữa một lần nữa. – hatfinch

+0

@hatfinch Cảm ơn bạn đã bình luận. Đó là khá nhiều những gì tôi đã kết thúc làm, nhưng tôi không chắc chắn 100% những gì bạn có nghĩa là "sắp xếp cho rằng xem nội dung được định vị lại trong khi di chuyển". Bạn có thể giải thích làm thế nào điều này sẽ làm việc? –

+0

Nó sẽ hoạt động giống như phương pháp bạn mô tả, ngoại trừ thay vì làm tê liệt giảm tốc để đảm bảo rằng người dùng không thể cuộn hết ảnh toàn cảnh ba chiều, bạn đang di chuyển toàn cảnh. Vì vậy, đối với chế độ xem "nội dung" ABC, bạn có xxxABCxxx trong scrollview (x chỉ là khoảng trống) và khi người dùng cuộn, ví dụ: ở bên trái, sau khi họ đã cuộn một chiều rộng hình ảnh, bạn di chuyển chế độ xem nội dung để bạn có xxABCxxxx. Ngoại trừ việc bạn làm điều đó với rất nhiều 'x' mà họ sẽ phải rất cố ý về việc cố gắng để đạt được các cạnh. Điều đó có ý nghĩa? – hatfinch

0

tôi sẽ cố gắng sử dụng các phương pháp giao thức UIScrollViewDelegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
.210

nó được gọi khi người dùng cuộn (ngay cả khi nó giảm tốc)

và bên trong nó tôi sẽ thay đổi contentoffset

+0

Phương pháp scrollViewDidScroll là nơi tôi đang gọi phương thức setContentOffset trình bày ở trên. Tôi cũng đã thử trực tiếp thiết lập contentOffset trong scrollViewDidScroll, nhưng không may mắn. Bất cứ khi nào bù đắp nội dung được thiết lập, sự giảm tốc ngay lập tức dừng lại. Đầu ra nhật ký dưới đây cho thấy thay đổi bù đắp nội dung, và sau đó scrollViewDidEndDecelerating được kích hoạt. '(62.000000 0,000000) (22.000000 0,000000) (0,000000 0,000000) (5113.000000 0,000000) scrollViewDidEndDecelerating' –

+0

như thế nào? đăng mã của scrollViewDidScroll của bạn ... – meronix

0

thời gian gần đây tôi đang làm cuộn vô hạn cùng và vô tình tìm thấy các giải pháp:

Chỉ cần thiết lập bounces=YES, alwaysBounceHorizontal=YES hoặc/và alwaysBounceVertical=YES (phụ thuộc vào hướng bạn di chuyển đến).

Vậy đó, điều này phù hợp với tôi.:)

1

Thay vì

[scrollView setContentOffset:tempContentOffset]; 

sử dụng

scrollView.contentOffset = tempContentOffset; 
Các vấn đề liên quan