要以编程方式滚动 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,那么我认为滚动视图仍未滚动,因此我不会对此事件执行操作。

它并没有完全解决问题,但它出现的次数要少得多。