这很奇怪,我想知道是否有人有任何想法?
我正在尝试滚动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
时会被调用!
答案 0 :(得分:79)
我也遇到了这种情况,并最终做了这个解决方法:
[UIView animateWithDuration:.25 animations:^{
self.scrollView.contentOffset = ...;
}];
答案 1 :(得分:7)
根据个人经验,当setContentOffset:在动画有机会运行之前被多次调用时会出现此问题。
我还没有完全追查这个问题,但我相信这个问题是这样的:
setContentOffset:调用animated来设置新的偏移值。 setContentOffset:随后使用相同的参数调用,这将取消动画。它还注意到新参数与旧参数相同,因此即使动画尚未运行,也不需要做任何事情。
上面的解决方案以某种方式打破了这个循环,但也许一个较少的解决方案是在代码中放置断点并消除多个调用。
答案 2 :(得分:2)
很难说你给的那段代码。事实上,如果你说,你有一个项目,一切都在相同的条件下工作,那么显然条件不一样:)我无法重现这个问题,但这里有一些假设2例:
使用nib创建UIScrollView。
-(void)scrollViewDidScroll:(UIScrollView *)sender;
您必须设置代理:
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)
})
})
}