加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何正确使用swipeWithEvent浏览webView,Obj-C

发布时间:2020-12-16 03:14:21 所属栏目:百科 来源:网络整理
导读:我想通过使用事件swipeWithEvent来实现我的webView中的第四个导航功能.但是,我不知道如何使用这个. 我有一个主要的webView,和两个方法导航回来和第四.这里的一大问题是我不太清楚如何写这个问题.我只需要知道如何识别我的webView上的滑动手势,并调用我的两种
我想通过使用事件swipeWithEvent来实现我的webView中的第四个导航功能.但是,我不知道如何使用这个.

我有一个主要的webView,和两个方法导航回来和第四.这里的一大问题是我不太清楚如何写这个问题.我只需要知道如何识别我的webView上的滑动手势,并调用我的两种方法.类似于Safari,Google Chrome和Mozilla Firefox.谢谢.

编辑
我已经实施了这些方法,假设允许我向后滑动.

- (void)swipeWithEvent:(NSEvent *)event {
    NSLog(@"Swipe With Event");
    CGFloat x = [event deltaX];
    //CGFloat y = [event deltaY];

    if (x != 0) {
        (x > 0) ? [self goBack:self] : [self goForward:self];
    }
}


-(BOOL)recognizeTwoFingerGestures
{
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    return [defaults boolForKey:@"AppleEnableSwipeNavigateWithScrolls"];
}

- (void)beginGestureWithEvent:(NSEvent *)event
{
    if (![self recognizeTwoFingerGestures])
        return;

    NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseAny inView:nil];

    self.twoFingersTouches = [[NSMutableDictionary alloc] init];

    for (NSTouch *touch in touches) {
        [twoFingersTouches setObject:touch forKey:touch.identity];
    }
}

- (void)endGestureWithEvent:(NSEvent *)event
{
    if (!twoFingersTouches) return;

    NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseAny inView:nil];

    // release twoFingersTouches early
    NSMutableDictionary *beginTouches = [twoFingersTouches copy];
    self.twoFingersTouches = nil;

    NSMutableArray *magnitudes = [[NSMutableArray alloc] init];

    for (NSTouch *touch in touches)
    {
        NSTouch *beginTouch = [beginTouches objectForKey:touch.identity];

        if (!beginTouch) continue;

        float magnitude = touch.normalizedPosition.x - beginTouch.normalizedPosition.x;
        [magnitudes addObject:[NSNumber numberWithFloat:magnitude]];
    }

    // Need at least two points
    if ([magnitudes count] < 2) return;

    float sum = 0;

    for (NSNumber *magnitude in magnitudes)
        sum += [magnitude floatValue];

    // Handle natural direction in Lion
    BOOL naturalDirectionEnabled = [[[NSUserDefaults standardUserDefaults] valueForKey:@"com.apple.swipescrolldirection"] boolValue];

    if (naturalDirectionEnabled)
        sum *= -1;

    // See if absolute sum is long enough to be considered a complete gesture
    float absoluteSum = fabsf(sum);

    if (absoluteSum < kSwipeMinimumLength) return;

    // Handle the actual swipe
    if (sum > 0)
    {
        [self goForward:self];
    } else
    {
        [self goBack:self];
    }


}

但是,这段代码没有做任何事情.它似乎没有被调用.

解决方法

对于现代操作系统(Lion和更新版),这是“我如何用Y做X”之一?答案是“不要使用Y”的问题

-swipeWithEvent:用于实现10.6风格的触控板滑动,屏幕上的内容不会随着滑动而移动.大多数Mac轨迹笔没有配置为允许这种滑动了;必须将Trackpad pref窗格中的“在页面之间滑动”首选项设置为“用三个手指滑动”才能使用,这不是默认设置,也不是用户更改的常用设置.

狮子式“流畅的滑动”代替进入滚动事件. Xcode SDK中的PictureSwiper示例项目是一个很好的开始,但作为一个概述,您的工作如下:

>如果您只需要支持Mountain Lion,请使用历史堆栈模式中的NSPageController,并跳过其余的乱码.
>这是一团糟您可能只想考虑在山狮上支持流体滑动.
不要说我没有警告你.
>创建自定义视图,这是您想要滑动的任何视图的超级视图.
>覆盖-wantsScrollEventsForSwipeTrackingOnAxis:为相应的轴返回YES.如果您正在进行Safari风格的后退/远程导航,那就是NSEventGestureAxisHorizo??ntal.
深吸一口气这是一个doozy.
>覆盖-scrollWheel:在您的自定义视图中.你的覆盖应该调用-trackSwipeEventWithOptions:dampenAmountThresholdMin:max:usingHandler :.大致来说,衰减量阈值最小值是用户可以向左滑动的数据视图,而最大的数量是可以向右滑动的数量.处理程序是一个块,当用户刷新时重复调用;这应该:

>放置一个NSImageView,将要返回/转发的页面的屏幕截图放在网页视图的后面.
>移动网页视图以匹配用户的动作.请注意,gestureAmount参数与衰减量阈值一样(分数和可能为负数)的项目;您必须将其乘以视图宽度才能正确定位Web视图.
>如果手势阶段为NSEventPhaseEnded,则评估gestureAmount以确定用户是否完成了手势.如果没有,将网页视图动画回到原地;如果他们这样做,把它放回原位,没有动画,并导航到新页面.

正如你所看到的,实际执行处理程序是非常重要的,我甚至没有描述所有的细节.即使所有这些细节,一个高度熟练的程序员可能不得不花几天时间才能正确. 10.7 SDK中的PictureSwiper示例是开始的好地方. (10.8版本的PictureSwiper使用NSPageController,就像你应该做的)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读