相关疑难解决方法(0)

如何准确知道UIScrollView的滚动何时停止?

简而言之,我需要确切知道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)

objective-c uiscrollview ios

26
推荐指数
3
解决办法
4万
查看次数

SwiftUI - 检测 ScrollView 何时完成滚动?

我需要找出我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)

谢谢!

scrollview ios swift swiftui

12
推荐指数
1
解决办法
2592
查看次数

如何检测UIScrollView何时完成滚动在Swift中

从各方面来看,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)

但我还是没把它放在一起.有帮助吗?

uiscrollview ios swift

10
推荐指数
3
解决办法
2万
查看次数

在UITableViewCell完全可见时播放视频

我有一个包含视频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)

objective-c uitableview ios avplayer

7
推荐指数
2
解决办法
1万
查看次数

是否可以在UITableView完成滚动时收到通知?

我引用了这个问题:如何检测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上)还是我错过了另一种方法来做到这一点?

iphone cocoa-touch

6
推荐指数
1
解决办法
3563
查看次数

检测UiScrollView上的触摸位置

我需要从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)

animation touch uiscrollview ios

2
推荐指数
1
解决办法
6569
查看次数