2012-06-04 21 views
26

Tôi đang cố gắng triển khai thanh tab tùy chỉnh có thể cuộn và có phân trang tại từng mục trên tab. Cho rằng tôi đang sử dụng scrollViewWillEndDragging delegate: withVelocity: targetContentOffset: hoạt động hoàn hảo với một vấn đề.scrollViewWillEndDragging: withVelocity: targetContentOffset: không hoạt động trên các cạnh của UISCrollView

Cách hoạt động phân trang của tôi là, nếu contentOffset gần đúng mục, nó sẽ thay đổi targetContentOffset thành bù của mục đó. Điều tương tự cho phía bên trái.

Vấn đề là, bất cứ khi nào tôi ở nửa bên trái của mục đầu tiên và bên phải cuối cùng (chế độ xem cuộn hoạt động theo chiều ngang), nó phải đi tới ContentOffset 0 và độ lệch nội dung của mục ngoài cùng bên phải (trừ những người trên màn hình), nhưng nó không.

Tôi đã kiểm tra với trình gỡ rối và targetContentOffset-> x thực sự là 0 (trong trường hợp đầu tiên - bên trái của mục ngoài cùng bên trái). Vì vậy, vấn đề là UIScrollView không cuộn ở đó. Tôi bị lạc.

Đây là đại biểu thực hiện của tôi:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
       withVelocity:(CGPoint)velocity 
      targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    NSInteger index = lrintf(targetContentOffset->x/self.tabWidth); 
    targetContentOffset->x = index * self.tabWidth; 
} 

Dưới đây là sơ đồ giải thích những gì tôi muốn làm.

|-------|-------|-------|-------|-------|-------|-------| 
|  |  |  |  |  |  |  | 
|  |  |  |  |  |  |  | 
|_______|_______|_______|_______|_______|_______|_______| 

     |_______________________________________| 
     where it is and i scroll it to the left 

    <----| 

    |_______________________________________| 
       where it would stop 

|_______________________________________| 
     where i want it to stop 

Trả lời

14

Đây là vấn đề đã biết. Sau khi một số điều tra và nói chuyện với người khác nó đã được đề nghị nó có thể là một lỗi, mà hóa ra là chính xác. Tôi báo cáo nó với Apple và nó được đánh dấu là trùng lặp nhưng vẫn mở. Chỉ cần trả lời cho những người bạn của bạn với cùng một vấn đề. Tôi giải quyết nó giống như Big Papoo gợi ý, bằng cách sử dụng một khoản bù đắp gần với những gì tôi muốn (0,1 dường như làm điều đó). Điều tương tự cho cùng bên phải.

+0

Tôi cũng gặp phải sự cố này. Bất kỳ cơ hội nào bạn có thể đăng số ID lỗi Apple — hoặc tốt hơn, liên kết tới mục nhập OpenRadar — để hỗ trợ bản thân tôi và những người khác có thể đăng một báo cáo lỗi trùng lặp? (Nó khá nổi tiếng rằng Apple ưu tiên sửa lỗi dựa trên số lượng báo cáo mà họ nhận được.) – Calrion

+0

Chắc chắn. Đó là một bản sao của 10255505 nhưng có vẻ như nó không tồn tại trong OpenRadar. Dù sao nó có vẻ như đã đóng cửa bây giờ, nhưng tôi không biết liệu họ có phát hành bản sửa lỗi hay không. – dvieira

3

tôi thấy 2 hành vi không có giấy tờ mà bạn có thể kiểm tra: - Thiết zero như trận chung kết bù đắp không làm việc, tôi khuyên bạn nên đặt 1 hoặc bất cứ điều gì lớn hơn không (0.5 có thể làm việc, không kiểm tra) - Bạn 'd tốt hơn kiểm tra các dấu hiệu vận tốc và tính toán bù đắp cuối cùng của bạn được ở bên trái hoặc bên phải của điểm hiện tại, nơi người dùng loại bỏ là ngón tay. Đừng cố gắng làm cho di chuyển lùi về phía bên kia.

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Bạn đúng. Tôi cũng đã điều tra và nói chuyện với người khác và phát hiện ra đó là một lỗi. Chỉ cần quên để trả lời câu hỏi của riêng tôi, xin lỗi (nếu bạn muốn biết thêm chi tiết xin vui lòng hãy xem nó). Một bù đắp như 0,1 dường như làm điều đó. Dù sao, cảm ơn bạn rất nhiều. – dvieira

0

Nếu bạn đang sử dụng một cái nhìn bảng ngang, sau đó bên scrollViewWillEndDragging của bạn: withVelocity: targetContentOffset: chức năng, bạn có thể gọi:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Tôi thấy điều này để làm việc tốt hơn nhiều so với cố gắng để thao tác targetContentOffset-> y trong chế độ xem bảng ngang.

8

Tôi đã thử thiết lập bù đắp cuối cùng cho một cái gì đó hơi không hoặc kích thước nội dung như đề xuất của Big Papoo nhưng nhận thấy rằng điều này loại bỏ các thư bị trả lại cuộn quá mức. Giải pháp của tôi cho điều này là để kiểm tra targetContentOffset gốc để xem nếu nó là bằng không hoặc contentSize và để lại nó nếu nó là:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    float expectedOffset = targetContentOffset->x; 
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset. 

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset. 

    // Adjust the offset to make sure it works. 
    if (targetOffset == 0) targetOffset = 1; 
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1; 

    targetContentOffset->x = targetOffset; 
} 

Bạn có thể dĩ nhiên sau đó sử dụng scrollViewDidEndDecelerating: để di chuyển scrollview rằng 1 điểm .

8

Sự cố đã được khắc phục trên iOS 6.0.

Bây giờ nó hoạt động như mong muốn.

Các vấn đề liên quan