2010-10-15 34 views
37

Điều này rất kỳ quặc và tôi tự hỏi liệu có ai có suy nghĩ gì không?Vấn đề với uiscrollview setcontentoffset hoạt hình không cuộn khi hoạt hình: có được thiết lập

Tôi đang cố cuộn cuộn UIScrollView để phản hồi với một nút nhấn trên iPad.

Nếu tôi làm:

xem
CGPoint currentOff = scrollView.contentOffset; 
currentOff.x+=240; 
[scrollView setContentOffset:currentOff animated: NO]; 

Các cuộn nhảy đến vị trí cần thiết như mong đợi, nhưng tôi muốn nó di chuyển. Tuy nhiên, khi tôi làm:

CGPoint currentOff = scrollView.contentOffset; 
currentOff.x+=240; 
[scrollView setContentOffset:currentOff animated: YES]; 

Sau đó, nó không làm gì cả! Tôi có một chế độ xem cuộn khác đang hoạt động bình thường và đáp ứng setContentOffset:YES như mong đợi, vì vậy tôi khá bối rối. Bất kỳ ý tưởng về lý do tại sao di chuyển có thể không xảy ra được chào đón nhất!

Ngoài ra, - (void)scrollViewDidScroll:(UIScrollView *)sender không nhận được gì cả khi animated:YES được sử dụng nhưng được gọi khi sử dụng animated:NO!

+2

hm, tôi thấy một thứ rất giống nhau. cả setContentOffset và scrollRectToVisible hoạt động như mong đợi với animation = false, nhưng không làm gì với animated = true. cũng tò mò, nếu tôi kéo scrollView với ngón tay của tôi một chút và sau đó thử nút một lần nữa, nó hoạt động. Tôi đã in contentView của scrollView và có vẻ đúng. –

+0

Hài hước, tôi vừa gặp vấn đề tương tự, nhưng bị đảo ngược. Nó chỉ hoạt động nếu tôi animate nó. –

+1

Xin chào. kiểm tra câu trả lời của tôi tại http://stackoverflow.com/a/27088865/1510171 – tomeron11

Trả lời

72

Tôi có điều này xảy ra quá và đã kết thúc làm việc này:

[UIView animateWithDuration:.25 animations:^{ 
    self.scrollView.contentOffset = ...; 
}]; 
+2

Tôi đã có cùng một vấn đề, cách giải quyết này cũng làm việc cho tôi! cảm ơn! –

+0

bạn có thể giải thích lý do (đối với setContentOffset: hoạt hình: không hoạt động và làm theo cách này) – Tatvamasi

+2

Tôi không chắc chắn, tôi nghĩ rằng đó là lỗi mà phiên bản hoạt ảnh không hoạt động. –

0

Bạn có thể thử:

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES]; 
2

Khó nói với rằng đoạn mã bạn đã cho. Và trên thực tế, nếu bạn nói, bạn có một dự án, nơi mọi thứ đang hoạt động trong cùng điều kiện, thì rõ ràng là điều kiện không giống nhau :) Tôi không thể tái tạo vấn đề, nhưng đây là một số giả định cho 2 trường hợp:

  1. Tạo UIScrollView với nib.

    • Đừng quên tạo IBOutlet và đặt nó vào phần tử scrollView trong nib. Trong một ứng dụng dựa trên khung nhìn đơn giản, ngay sau đó tôi đã có scrollView làm việc như bạn muốn trong hoạt ảnh: cả YES và NO. Tuy nhiên, để làm cho công việc

    -(void)scrollViewDidScroll:(UIScrollView *)sender; bạn phải thiết lập các đại biểu:

yourScrollView.delegate = self;

nơi 'tự' là lớp, nơi bạn có chức năng scrollViewDidScroll của bạn; btw lớp này phải phù hợp với giao thức 'UIScrollViewDelegate'.

2.Tạo đối tượng UIScrollView theo cách thủ công.

  • đây ý tưởng về cơ bản là giống nhau, vì vậy tôi sẽ chỉ cung cấp một số mã đơn giản:

    -(void) creatingScrollView { 
        UIScrollView *newScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 5, 280, 44)]; 
        newScroll.pagingEnabled = YES; 
        newScroll.showsVerticalScrollIndicator = NO; 
        newScroll.showsHorizontalScrollIndicator = NO; 
    
        // ... some subviews being added to our scroll view 
    
        newScroll.delegate = self; 
        [self.view addSubview:newScroll]; 
        [newScroll release]; 
    } 
    

này làm việc cho tôi. Hy vọng điều này là hữu ích.

7

Nói từ kinh nghiệm cá nhân, vấn đề này xảy ra khi setContentOffset: là nhận được gọi là nhiều lần trước khi các hình ảnh động đã có một cơ hội để chạy.

tôi đã không hoàn toàn theo dõi xuống vấn đề này, nhưng tôi tin rằng vấn đề đi một cái gì đó như thế này:

setContentOffset: hoạt hình được gọi đó đặt giá trị bù đắp mới. setContentOffset: sau đó được gọi với cùng các tham số, sẽ hủy hoạt ảnh. Nó cũng lưu ý rằng các tham số mới cũng giống như các tham số cũ vì vậy giả định không có gì cần phải được thực hiện, mặc dù hoạt hình chưa chạy.

Giải pháp trên bằng cách nào đó phá vỡ chu kỳ này, nhưng có lẽ một giải pháp ít kludgy hơn là đặt điểm ngắt trong mã và loại bỏ nhiều cuộc gọi.

+0

Giải thích này đã giúp tôi trong một vấn đề tương tự. Cảm ơn! – chadbag

+1

Khắc phục của tôi là xóa cuộc gọi đến 'setNeedsLayout' sau' setContentOffset: hoạt ảnh'. –

+0

um, "giải pháp trên" là gì, lol? giải pháp của makaron? – Harris

0

Tôi đang đối mặt với cùng một vấn đề mà ScrollView không cuộn. Và tôi vô hiệu hóa "Sử dụng bố cục tự động" trên màn hình và sau đó ScrollView hoạt động.

0

tôi đã cùng một vấn đề, trong trường hợp của tôi, tôi cũng bị chặn:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...} 

Phương pháp này được gọi là ngay sau: (Nó không chờ đợi cho đến khi kết thúc hoạt hình):

[scrollView setContentOffset:currentOff animated: YES]; 

Điều đó có nghĩa là nếu bạn có bất kỳ logic nào "chờ" kết thúc hoạt ảnh và bạn chặn scrollViewDidEndScrollingAnimation thì kết quả sẽ không được xác định, IE: kết thúc hoạt ảnh sớm.

EDIT: Việc chấp nhận giải pháp/cách giải quyết:

[UIView animateWithDuration:.25 animations:^{ 
    self.scrollView.contentOffset = ...; 
}]; 

Ngoài ra "tác phẩm" trong kịch bản của tôi bởi vì thiết lập contentOffset trực tiếp không gọi scrollViewDidEndScrollingAnimation Giải pháp

1

cho Xamarin.iOS

InvokeOnMainThread(() => 
{ 
    scrollView.SetContentOffset(new PointF((page * UIScreen.MainScreen.Bounds.Width), 0), true); 
}); 

Điều này cũng có thể được giải quyết bằng cách sử dụng UIView.Animate

UIView.Animate(
    duration: .25, 
    animation:() => 
    { 
     scrollView.SetContentOffset(new PointF((value * UIScreen.MainScreen.Bounds.Width), 0), true); 
    } 
); 
+0

Không nên 'hoạt hình' là * sai * khi bạn sử dụng hoạt ảnh tùy chỉnh (' UIView.Animate')? – testing

0
func scrollViewDidScroll(scrollView: UIScrollView) { 

    dispatch_async(dispatch_get_main_queue(),{ 

     UIView.animateWithDuration(0.10, animations: {() -> Void in 

      let loginScrollViewCurrentPosition:CGPoint = CGPointMake(self.loginScrollView.contentOffset.x, self.loginScrollView.contentOffset.y) as CGPoint 
      self.loginScrollView.setContentOffset(loginScrollViewCurrentPosition, animated: true) 

      }) 
    }) 

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