2009-07-06 12 views
5

Tôi có một UITextView có nhiều nội dung. Tôi có một nút cho phép người UITextView để tự động di chuyển + 10 pixel trong một vòng lặp NSTimer:iPhone Tự động cuộn UITextView nhưng cho phép cuộn thủ công cũng

scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 10); 
[textView setContentOffset:scrollPoint animated:YES]; 

này hoạt động thực sự tốt, như các hình ảnh động làm cho cuộn khá trơn tru. Tôi muốn cho phép người dùng bỏ qua hoặc lùi lại bằng cách di chuyển bằng ngón tay của họ, tuy nhiên do mã này sau khi hoạt ảnh cuộn, cuộn cuộn trở lại vị trí sẽ tự động cuộn.

Tôi cần phải đặt lại biến scrollPoint sau khi cuộn theo cách thủ công, nhưng tôi không chắc chắn cách thực hiện điều đó. Tôi đã thử triển khai phương thức ủy nhiệm

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

nhưng phương pháp này cũng tự động bật trên cuộn tự động của tôi.

Bất kỳ ý tưởng nào?

Trả lời

12

Bạn chỉ có thể làm cho nó di chuyển tương đối so với nơi mà nó là:

scrollPoint = textView.contentOffset; 
scrollPoint.y= scrollPoint.y+10; 
[textView setContentOffset:scrollPoint animated:YES]; 
+0

Tôi đã gặp vấn đề này. Giải pháp của bạn hoạt động rất tốt! Cảm ơn. –

+0

Nó cuộn mượt mà hơn với "hoạt hình: KHÔNG" – DerWOK

0

Tôi nghĩ rằng bằng cách có hiệu quả 2 cách để di chuyển nội dung của các bạn chiến đấu với API.

Nếu tôi hiểu chính xác, trong thiết lập hiện tại của bạn, bạn có nút kích hoạt hoạt ảnh.

Khi bạn cuộn theo cách này, hoạt ảnh được tạo và chạy trên một chuỗi khác. Trong khi hoạt ảnh đang chạy, lớp bản trình bày đang được thay đổi. Tuy nhiên, độ lệch nội dung thực tế là KHÔNG đặt cho đến khi hoạt ảnh hoàn tất.

Điều này hoạt động tốt và minh bạch, cho đến khi bạn cố gắng tạo hoạt ảnh cho cùng một thuộc tính trong khi nó đang được làm động.

Thông thường, trong trường hợp này bạn hủy hoạt ảnh hiện có, đặt khung thành lớp bản trình bày (vị trí trên màn hình hiện tại), sau đó áp dụng hoạt ảnh mới.

Tuy nhiên, bạn đang sử dụng phương thức tiện lợi của textView (setContentOffset: animated :). Khi bạn làm điều này, bạn từ bỏ kiểm soát hoạt hình tốt, để đổi lấy ít dòng mã hơn.

Tôi nghĩ rằng việc dừng cuộn đang tiến hành có thể khó khăn hoặc không thể sử dụng API cấp cao hơn. Điều này có nghĩa là để làm những gì bạn muốn bạn ít nhất sẽ phải thử một khối hoạt hình UIView và rất có thể thực sự tạo ra một CAAnimation.

Giải pháp dễ dàng hơn là giải quyết trên một phương tiện di chuyển textView của bạn. HIG ưu tiên sử dụng thao tác trực tiếp trên iPhone. Ngay cả khi nó rất dễ dàng để thực hiện di chuyển cả hai cách, tôi sẽ khuyên bạn nên bỏ phương pháp nút, và chỉ sử dụng thao tác trực tiếp bạn đang thực hiện.

2

Tôi muốn làm điều tương tự bạn đang cố gắng làm Ben, nhưng tôi thấy rằng hoạt ảnh quá tốn kém về thời gian hiển thị và dường như đánh bại mục đích. Tôi chơi xung quanh với nó và tìm thấy mã sau đây thực hiện chính xác những gì bạn muốn nó làm và không bog xuống hệ thống ở tất cả.

Cài đặt

if (autoscrollTimer == nil) { 
    autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(35.0/1000.0) 
                target:self 
                selector:@selector(autoscrollTimerFired:) 
                userInfo:nil 
                repeats:YES]; 
} 

Điều quan trọng là trong xoay OFF hoạt hình và di chuyển bù đắp trong từng bước nhỏ. Dường như nó chạy nhanh hơn và nó không can thiệp vào cuộn thủ công.

- (void)autoscrollTimerFired:(NSTimer*)timer { 
    CGPoint scrollPoint = self.textView.contentOffset; 
    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1); 
    [self.textView setContentOffset:scrollPoint animated:NO]; 
} 

Tôi khá mới để phát triển khách quan và iphone nên nếu có nhiều kinh nghiệm thấy vấn đề với cách tiếp cận này, tôi sẽ đánh giá cao mọi phản hồi.

+0

Trong trường hợp của tôi, tôi thực sự thích hoạt hình, nhưng nếu bạn chỉ di chuyển bằng 1 pixel thì nó sẽ mượt mà. Tuy nhiên, vì những lý do khác, tôi đã chuyển sang sử dụng một webView, vốn không kế thừa từ Chế độ xem cuộn, vì vậy tôi phải sử dụng Javascript để thực hiện cuộn. Kinh quá. Đó là một chút choppy, nhưng nó là một sự cân bằng đáng giá. –