设置动画时,uiscrollview setcontentoffset动画不滚动的问题:是的

时间:2010-10-15 10:18:07

标签: iphone uiscrollview animated

这很奇怪,我想知道是否有人有任何想法?

我正在尝试滚动UIScrollView以响应iPad上的按钮按下。

如果我这样做:

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

滚动视图按预期跳转到所需位置,但我希望它滚动。但是,当我这样做时:

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

然后它什么也没做!我有另一个滚动视图正常工作并按预期响应setContentOffset:YES,所以我很困惑。关于为什么滚动可能不会发生的任何想法都是最受欢迎的!

此外,- (void)scrollViewDidScroll:(UIScrollView *)sender在使用animated:YES时根本没有收到任何内容,但在使用animated:NO时会被调用!

9 个答案:

答案 0 :(得分:79)

我也遇到了这种情况,并最终做了这个解决方法:

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

答案 1 :(得分:7)

根据个人经验,当setContentOffset:在动画有机会运行之前被多次调用时会出现此问题。

我还没有完全追查这个问题,但我相信这个问题是这样的:

setContentOffset:调用animated来设置新的偏移值。 setContentOffset:随后使用相同的参数调用,这将取消动画。它还注意到新参数与旧参数相同,因此即使动画尚未运行,也不需要做任何事情。

上面的解决方案以某种方式打破了这个循环,但也许一个较少的解决方案是在代码中放置断点并消除多个调用。

答案 2 :(得分:2)

很难说你给的那段代码。事实上,如果你说,你有一个项目,一切都在相同的条件下工作,那么显然条件不一样:)我无法重现这个问题,但这里有一些假设2例:

  1. 使用nib创建UIScrollView。

    • 只是不要忘记创建IBOutlet并将其绑定到nib中的scrollView元素。在一个简单的基于视图的应用程序之后,我得到了scrollView按照您希望的动画工作:YES和NO。但要做好工作

    -(void)scrollViewDidScroll:(UIScrollView *)sender;您必须设置代理:

  2. yourScrollView.delegate = self;

    其中'self'是class,你有scrollViewDidScroll函数;顺便说一句,这个类必须符合'UIScrollViewDelegate'协议。

    2.手动创建UIScrollView对象。

    • 这里的想法基本相同,所以我只提供一些简单的代码:

      -(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];
      }
      

    这对我有用。希望这有用。

答案 3 :(得分:1)

Xamarin.iOS的解决方案

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

这也可以使用UIView.Animate

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

答案 4 :(得分:1)

我正在使用表格视图,正如aepryus solution's所说: setContentOffset:正在与其他动画同时调用

就我而言,我只是反转了以下命令:

<body style="height:1500px;" >
<nav class="navbar navbar-expand-lg fixed-top navbar-light bg-light">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
              <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Dropdown
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                <a class="dropdown-item" href="#">Action</a>
                <a class="dropdown-item" href="#">Another action</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="#">Something else here</a>
              </div>
            </li>
            <li class="nav-item">
              <a class="nav-link disabled" href="#">Disabled</a>
            </li>
          </ul>
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
          </form>
        </div>
      </nav>

像这样

[tableView reloadData];
[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];

内容偏移成功更改后,动画开始。

答案 5 :(得分:0)

你可以尝试:

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

答案 6 :(得分:0)

我遇到的问题是ScrollView无法滚动。 我在视图上禁用了“使用自动布局”,然后ScrollView正常工作。

答案 7 :(得分:0)

我有同样的问题,在我的情况下,我也在拦截:

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

此方法在紧接着之后调用: (它不会等到动画结束):

[scrollView setContentOffset:currentOff animated: YES];

这意味着,如果你有任何逻辑&#34;等待&#34;动画结束并截取scrollViewDidEndScrollingAnimation然后结果将是未定义的,IE:过早地结束动画。

编辑:已接受的解决方案/解决方法:

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

另外&#34;工作&#34;在我的场景中,因为直接设置contentOffset并不会调用scrollViewDidEndScrollingAnimation

答案 8 :(得分: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)

            })
    })

}