要以编程方式滚动 UIScrollView 但不在委托方法中仅处理此操作?
To scroll UIScrollView programmatically but don't handle only this action in delegate methods?
在我的 class 中,我编写了以下委托方法:
scrollViewDidScroll:
scrollViewDidEndScrollingAnimation:
然后为此 scrollView
我使用以下代码:
scrollView.frame = ...;
scrollView.contentSize = ...;
[scrollView setContentOffset:... animated:NO];
代码和委托在主线程中工作,但彼此异步。
问题是我不想用这段代码调用描述的委托方法。如何解决这个问题?我不能简单地写:
BOOL shouldCallDelegate = YES; //or NO
因为我还有其他代码需要通过这些委托方法处理。
已更新
我试过这样的事情:
NSLog(@"isMainThread == %d", [NSThread isMainThread]);
NSLog(@"isScrollViewBusy == %d", self.isScrollViewBusy);
self.isScrollViewBusy = YES;
scrollView.frame = ...;
scrollView.contentSize = ...;
[scrollView setContentOffset:... animated:NO];
self.isScrollViewBusy = NO;
然后在我的委托方法中:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
NSLog(@"isMainThread2 == %d", [NSThread isMainThread]);
NSLog(@"isScrollViewBusy2 == %d", self.isScrollViewBusy);
...
}
你觉得app一定要这样写?
isMainThread == 1
isScrollViewBusy == 0
isMainThread2 == 1
isScrollViewBusy2 == 0
在大多数情况下是这样,但是当您尝试旋转屏幕时:
isMainThread == 1
isScrollViewBusy == 0
isMainThread2 == 1
isScrollViewBusy2 == 1
所以所有代码都在主线程中,但突然间代码的第一部分 暂停?! 在应用程序处理旋转和委托时介于 YES 和 NO 之间方法被意外调用
id<UIScrollViewDelegate> delegate = scrollView.delegate;
scrollView.delegate = nil;
// do your stuff
scrollView.delegate = delegate
我发现的唯一改进是,如果偏移量小于 1,那么我认为滚动视图仍未滚动,因此我不会对此事件执行操作。
它并没有完全解决问题,但它出现的次数要少得多。
在我的 class 中,我编写了以下委托方法:
scrollViewDidScroll:
scrollViewDidEndScrollingAnimation:
然后为此 scrollView
我使用以下代码:
scrollView.frame = ...;
scrollView.contentSize = ...;
[scrollView setContentOffset:... animated:NO];
代码和委托在主线程中工作,但彼此异步。
问题是我不想用这段代码调用描述的委托方法。如何解决这个问题?我不能简单地写:
BOOL shouldCallDelegate = YES; //or NO
因为我还有其他代码需要通过这些委托方法处理。
已更新
我试过这样的事情:
NSLog(@"isMainThread == %d", [NSThread isMainThread]);
NSLog(@"isScrollViewBusy == %d", self.isScrollViewBusy);
self.isScrollViewBusy = YES;
scrollView.frame = ...;
scrollView.contentSize = ...;
[scrollView setContentOffset:... animated:NO];
self.isScrollViewBusy = NO;
然后在我的委托方法中:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
NSLog(@"isMainThread2 == %d", [NSThread isMainThread]);
NSLog(@"isScrollViewBusy2 == %d", self.isScrollViewBusy);
...
}
你觉得app一定要这样写?
isMainThread == 1
isScrollViewBusy == 0
isMainThread2 == 1
isScrollViewBusy2 == 0
在大多数情况下是这样,但是当您尝试旋转屏幕时:
isMainThread == 1
isScrollViewBusy == 0
isMainThread2 == 1
isScrollViewBusy2 == 1
所以所有代码都在主线程中,但突然间代码的第一部分 暂停?! 在应用程序处理旋转和委托时介于 YES 和 NO 之间方法被意外调用
id<UIScrollViewDelegate> delegate = scrollView.delegate;
scrollView.delegate = nil;
// do your stuff
scrollView.delegate = delegate
我发现的唯一改进是,如果偏移量小于 1,那么我认为滚动视图仍未滚动,因此我不会对此事件执行操作。
它并没有完全解决问题,但它出现的次数要少得多。