2009-09-18 7 views
54

Tôi đã sử dụng UIScrollView trước đây và đang sử dụng nó ngay bây giờ và không bao giờ gặp sự cố. Bây giờ tôi thêm nó vào một ứng dụng cũ, và trong khi nó hoạt động như mong đợi (tôi có thể nhìn vào nội dung, di chuyển xung quanh bằng ngón tay của tôi, tất cả các giới hạn và kích cỡ được thiết lập đúng để không có khoảng trống trong nội dung, v.v. .), Tôi chỉ không thể nhận được scrollToRectVisible để hoạt động. Tôi thậm chí còn đơn giản hóa cuộc gọi để nó chỉ di chuyển đến 0,0 vị trí:UIScrollView hoạt động như mong đợi nhưng scrollRectToVisible: không có gì

[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES]; 

hoặc di chuyển nó đến 0200:

[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES]; 

Tôi thậm chí làm một ứng dụng nhanh chóng để kiểm tra điều này và tôi có thể nhận được scrollRectToVisible để làm việc ở đó như tôi mong đợi. Nhưng trong ứng dụng cũ của tôi, tôi dường như không thể làm điều đó.

Tôi có thể cuộn scrollView với setContentOffset:, nhưng đó không phải là những gì tôi muốn.

ScrollView này và nội dung của nó được xác định trong nib của IB và được sử dụng với IBOutlet. Mã duy nhất tôi đang sử dụng trong ứng dụng của mình để xử lý scrollView là

[scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)]; 

(Tôi chỉ quan tâm đến cuộn dọc không nằm ngang).

Có ai gặp sự cố như thế này không?

Tôi đã so sánh các thuộc tính scrollView trong cả hai ứng dụng và chúng giống nhau.

PHỤ LỤC:

My scrollViews khung là: 0,000000 0,000000 480,000000 179,000000

My scrollViews contentSize là: 0,000000 324,000000

Nó vẫn hoạt động như rect Tôi muốn di chuyển đến là đã có thể nhìn thấy và không di chuyển là cần thiết. Không chắc chắn nếu đó là những gì đang xảy ra. Đây chỉ là điều darnest. Có vẻ như là một điều dễ dàng như vậy để giải quyết ...

PHỤ LỤC# 2:

Đây là cách tôi đang làm cho làm mà không scrollRectToVisible:

CGPoint point = myRect.origin; 
if (![clefScrollView pointInside:point withEvent:nil]) { 
    point.x = 0; 
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height) 
     point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height; 
    [clefScrollView setContentOffset:point animated: YES]; 
} 

Mọi thứ khác về scrollview này hoạt động như mong đợi, nhưng scrollRectToVisible. TẠI SAO?!? Có dự đoán hoang dã nào không?

Trả lời

99

Hơn một tháng sau, và cuối cùng tôi đã tìm ra. Trong khi giải pháp thay thế ở trên hoạt động tốt, nó đã làm tôi thất vọng và cuối cùng tôi phải tìm ra. Hóa ra đó là một sai lầm ngu ngốc.

Dưới đây là các mã cũ trong viewDidLoad của tôi, nơi tôi lập scrollview:

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)]; 

Giá trị của một chiều cao hoặc chiều rộng scrollview không thể bằng 0!Tôi nghĩ rằng điều này đã vượt qua tôi bởi vì tôi đã giả định rằng kích thước ScrollView bắt đầu với kích thước hợp lệ, và tôi đã thiếu một thực tế là một kích thước là số không!

này hoạt động:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 

Hope this helps ai đó ngoài kia. Tôi chắc chắn đã dành quá nhiều thời gian cố gắng để gỡ lỗi này.

+0

Cảm ơn! Tôi đã nhận bit bởi điều này quá (tôi đã thiết lập chiều cao nhưng không chiều rộng). –

+3

Điều này KHÔNG hoàn toàn chính xác - c.f. Câu trả lời của Orion dưới đây (tôi có chiều rộng/chiều cao khác không, nó không phải là '0' gây ra vấn đề ...) – Adam

+0

Tôi đã làm điều này theo cách tương tự nhưng vẫn scrollRectToVisible không hoạt động. Nó hoạt động trong mô phỏng nhưng không hoạt động trên thiết bị. Hãy giúp tôi. –

43

Vâng, tôi chưa thành công với scrollRectToVisible:animated:, nhưng setContentOffset:animated: luôn hoạt động đối với tôi. Vì tò mò, tại sao bạn không muốn sử dụng setContentOffset:animated:? Nó có vẻ là giải pháp thích hợp.

+3

Thật không may, setContentOffset sẽ di chuyển đến điểm, bất kể nó đã được nhìn thấy hay chưa. Tôi có thể làm thêm công việc xác định xem điểm có thể nhìn thấy hay không, tuy nhiên, tôi vẫn tò mò tại sao scrollRectToVisible không hoạt động, khi tôi thấy nó hoạt động trong mẫu của riêng tôi và các mẫu khác trên mạng. Tôi phải làm điều gì đó sai, nhưng chỉ với ba hoặc bốn dòng mã cho scrollView, tôi không thể thấy cái gì ?! – mahboudz

0

Giải pháp được đề xuất ở trên có thể vẫn gây ra lỗi nếu bạn chưa đặt khung cho "clefScrollView".

Nếu giải pháp ở trên được sử dụng và vẫn gặp sự cố tương tự, hãy đảm bảo bạn đã khởi tạo khung scollView (trong trường hợp này là clefScrollView) trước khi đặt chế độ xem nội dung.



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)]; 

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 



1

tôi đã có nó như thế này và nó đã không làm việc

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue); 

tôi đã chỉ cần thay đổi chiều cao của contentSize, vì vậy tôi không nghĩ rằng sẽ cung cấp cho tôi bất kỳ vấn đề nhưng nó đã làm ...

đã phải thay đổi nó để này

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue); 

quay ra scrollView.contentSize.width không necessari ly được đặt thành giá trị hợp lệ từ khi bắt đầu, vì vậy, hãy cung cấp giá trị cụ thể cho giá trị cụ thể

5

Bạn có thể muốn kiểm tra và xem thuộc tính delaysContentTouches của scrollView được đặt thành NO.

Nếu bạn gọi phương thức scrollRectToVisible hoặc setContentOffset từ một lần chạm trong chế độ xem phụ của scrollView thì cuộn của bạn có thể giữ mọi thứ bằng cách trì hoãn chạm.

Vì vậy, hãy đảm bảo bạn đặt thông tin sau trong scrollView của mình.

scrollView.delaysContentTouches = NO; 

Bạn rất có thể sẽ di chuyển scrollView có và không có hoạt ảnh được đặt thành CÓ.

0

Một chút muộn cho trò chơi nhưng tôi đã gặp vấn đề tương tự. Mặc dù tôi đã hoàn toàn thiết lập kích thước nội dung cuộn của tôi một cách chính xác - thậm chí quá mức cho giá trị độ cao. Ngay cả sau khi kiểm tra mở rộng để xác thực các khung và kích thước nội dung - vẫn không hoạt động. Tôi đã phải điều chỉnh chiều cao khung "giới hạn", sau đó mọi thứ hoạt động tốt.

0

Tôi đã có các triệu chứng giống như vấn đề này..the scrollRectToVisible không hoạt động như dự định. Vấn đề của tôi là scrollview trên storyboard có một vấn đề ràng buộc mơ hồ. Một khi đã được cố định cuộc gọi đã làm việc tốt. Nó là cái gì khác để kiểm tra khi cuộc gọi scrollRectToVisible không hoạt động như dự định.