简而言之,我需要确切知道scrollview何时停止滚动.通过"停止滚动",我的意思是它不再移动而不被触摸的那一刻.
我一直在研究一个水平的UIScrollView子类(适用于iOS 4),其中包含选择标签.它的一个要求是它停止滚动到一定速度以下,以便更快地进行用户交互.它还应该捕捉到选项卡的开头.换句话说,当用户释放滚动视图并且其速度较低时,它会捕捉到一个位置.我实现了它并且它可以工作,但它有一个错误.
我现在拥有的:
scrollview是它自己的委托.每次调用scrollViewDidScroll:时,它都会刷新与速度相关的变量:
-(void)refreshCurrentSpeed
{
float currentOffset = self.contentOffset.x;
NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
deltaOffset = (currentOffset - prevOffset);
deltaTime = (currentTime - prevTime);
currentSpeed = deltaOffset/deltaTime;
prevOffset = currentOffset;
prevTime = currentTime;
NSLog(@"deltaOffset is now %f, deltaTime is now %f and speed is %f",deltaOffset,deltaTime,currentSpeed);
}
Run Code Online (Sandbox Code Playgroud)
然后根据需要继续捕捉:
-(void)snapIfNeeded
{
if(canStopScrolling && currentSpeed <70.0f && currentSpeed>-70.0f)
{
NSLog(@"Stopping with a speed of %f points per second", currentSpeed);
[self stopMoving];
float scrollDistancePastTabStart = fmodf(self.contentOffset.x, (self.frame.size.width/3));
float scrollSnapX = self.contentOffset.x …Run Code Online (Sandbox Code Playgroud) 我需要找出我ScrollView停止移动的确切时刻。SwiftUI 可以实现吗?
这将是UIScrollView.
想了很久还是不明白……
一个用于测试的示例项目:
struct ContentView: View {
var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0...100, id: \.self) { i in
Rectangle()
.frame(width: 200, height: 100)
.foregroundColor(.green)
.overlay(Text("\(i)"))
}
}
.frame(maxWidth: .infinity)
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
从各方面来看,Ashley Smart提出的Obj-C中的这个问题是一个很好的解决方案(如何检测UIScrollView何时完成滚动).
-(void)scrollViewDidScroll:(UIScrollView *)sender
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
//ensure that the end of scroll is fired.
[self performSelector:@selector(scrollViewDidEndScrollingAnimation:) withObject:nil afterDelay:0.3];
...
}
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我需要一个解决方案,在Swift中.
似乎由Matt(dispatch_after - GCD in swift?)贡献的优秀延迟函数可能会有所帮助.
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
Run Code Online (Sandbox Code Playgroud)
并实施为......
delay(0.4) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但我还是没把它放在一起.有帮助吗?
我有一个包含视频URL的数组,我想在UITableviewcell完全可见时播放这些视频.
我试过这个
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
NSArray* cells = homeTabl.visibleCells;
for (HomeCell* cell in cells)
{
if (cell.frame.origin.y > offset.y &&
cell.frame.origin.y + cell.frame.size.height < offset.y + bounds.size.height)
{
NSIndexPath *path = [homeTabl indexPathForCell:cell] ;
index = path.row;
fullvisible = YES;
[homeTabl reloadData];
}
else
{
fullvisible = NO;
}
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (fullvisible)
{
NSURL *url = [NSURL URLWithString:[[responsearray objectAtIndex:indexPath.row]valueForKey:@"feed_video"]];
cell.videoItem = [AVPlayerItem playerItemWithURL:url];
cell.videoPlayer = [AVPlayer playerWithPlayerItem:cell.videoItem];
cell.avLayer = [AVPlayerLayer playerLayerWithPlayer:cell.videoPlayer]; …Run Code Online (Sandbox Code Playgroud) 我引用了这个问题:如何检测UIScrollView何时完成滚动
UITablewView是UIScrollView的子类,当我手动滚动表时,我的UITableView委托确实收到了- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView消息.
但是,当我打电话- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated滚动表格时,我没有收到scrollViewDidEndDecelerating消息.我正在调用scrollRowToIndexPath...方法animated:YES.
这是一个错误/ API限制(在iPhone SDK 3.1.3上)还是我错过了另一种方法来做到这一点?
我需要从UIScrollView获取触摸位置.但是当我为scrollview创建一个子类时:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSArray *touchesArray = [touches allObjects];
UITouch *touch = (UITouch *)[touchesArray objectAtIndex:0];
CGPoint point = [touch locationInView:self];
self.position = point;}
Run Code Online (Sandbox Code Playgroud)
该函数touchesBegan并不总是被调用.如果我快速滑动,touchesBegan从不调用,而是scrollViewDidScroll直接调用.
我无法使用,UIGesture (UITapGestureRecognizer, ... )因为用户不点按或滑动.
还有其他方法可以从UIScrollView获取位置吗?
编辑:
谢谢你:https://stackoverflow.com/a/15763450/1752843
UIScrollView子类:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
self.position = point;
return self;
}
Run Code Online (Sandbox Code Playgroud) ios ×5
uiscrollview ×3
objective-c ×2
swift ×2
animation ×1
avplayer ×1
cocoa-touch ×1
iphone ×1
scrollview ×1
swiftui ×1
touch ×1
uitableview ×1