【问题标题】:Unable to setContentOffset in scrollViewDidEndDragging无法在 scrollViewDidEndDragging 中设置 ContentOffset
【发布时间】:2013-10-11 17:15:23
【问题描述】:

我正在尝试在以下委托方法中修改滚动的 contentOffset:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

我已经尝试了以下两种方法:

[UIView animateWithDuration:.2 animations:^ {
   [scrollView setContentOffset:CGPointZero animated:NO];
}];

[UIView animateWithDuration:.2 animations:^ {
   CGRect svBounds = self.bounds;
   svBounds.origin.y = 0;
   self.bounds = svBounds; 
}];

问题在于,虽然这会立即改变偏移量(动画完成后的日志证明),但它不会改变可见的滚动位置。我的滚动视图的后续委托方法进一步证明了这一点,这表明边界确实根本没有改变。表示y位置不为0。

是否禁止更改此特定委托方法中的内容偏移量?如果是这样,我什么时候可以更改偏移量?一旦用户完成拖动(在一定量之后),我正在尝试执行将可见滚动区域返回到顶部的动画。

谢谢!

【问题讨论】:

  • 我能够让它在 scrollViewWillBeginDecelerating 中工作。这在 scrollViewDidEndDragging 和 scrollViewWillEndDragging 中都不起作用。也许是因为在调用这些方法时它们仍在加速?我不确定......我不知道为什么会这样,也许其他人可以阐明。

标签: iphone ios objective-c uiscrollview core-animation


【解决方案1】:

你应该在动画之前“nil”你的scrollView委托,在scrollViewDidEndDragging:willDecelerate:中设置内容偏移会导致重复委托。

self.scrollView.delegate = nil;
[self.scrollView setContentOffset:CGPointMake(x, y) animated:YES];
self.scrollView.delegate = self;

【讨论】:

    【解决方案2】:

    根据您要达到的效果,您可能会更幸运地使用此委​​托方法:

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

    您可以选择要用于滚动视图的目标内容偏移量,以便在用户停止拖动后减速到。

    【讨论】:

      【解决方案3】:

      我最终所做的是再次分派到主队列。 含义:

      -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
      NSLog(@"END DRAG");
      CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
      if (yVelocity < 0) {
          NSLog(@"Up");
      } else {
          NSLog(@"Down");
      }
      
      if (yVelocity < 0 && scrollView.contentOffset.y < -100 && scrollView.contentOffset.y > -200) //UP - Hide
      {
          NSLog(@"hiding");
          dispatch_async(dispatch_get_main_queue(), ^{
              [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
          });
      }
      else if (yVelocity > 0 && scrollView.contentOffset.y < -100) //DOWN - Show
      {
          NSLog(@"showing");
          dispatch_async(dispatch_get_main_queue(), ^{
              [scrollView setContentOffset:CGPointMake(0, -300) animated:YES];
          });
      }
      
      }
      

      它确实有效:-)

      【讨论】:

      • 我不知道你为什么想在主线程上调度,但是在搜索了如何完成这个动画几乎一天之后,这是我发现的唯一解决方案完美无缺。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2022-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多