zoukankan      html  css  js  c++  java
  • 3D touch手势,peek手势,pop手势,ios开发

    /**

     *  当前结果页面

     */

    .h文件中加入协议

    @interface SVCurrentResultViewCtrl: SVViewController <UIViewControllerPreviewingDelegate>

    .m文件中写

    // 判断3D Touch是否可用,可用则注册

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)

        {

            [self registerForPreviewingWithDelegate:self sourceView:uiview];

        }

     }

    /**

     *  peek手势

     */

    - (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext

                  viewControllerForLocation:(CGPoint)location

    {

        // 获取用户手势点所在cell的下标。同时判断手势点是否超出tableView响应范围。

        if (![self getShouldShowRectAndIndexPathWithLocation:location])

        {

            return nil;

        }

        // 弹出视图的初始位置,sourceRect是peek触发时的高亮区域。这个区域内的View会高亮显示,其余的会模糊掉

        previewingContext.sourceRect = sourceRect;

        // 获取数据进行传值

        UIButton *currentBtn = _buttons[selectedPath.section];

        SVDetailViewCtrl *childVC = [[SVDetailViewCtrl alloc] init];

        [childVC setTestId:_resultModel.testId];

        [childVC setTestType:[NSString stringWithFormat:@"%ld", (long)currentBtn.tag]];

        return childVC;

    }

    /**

     *  pop手势

     */

    - (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext

         commitViewController:(UIViewController *)viewControllerToCommit

    {

        UIButton *currentBtn = _buttons[selectedPath.section];

        [self CellDetailClick:currentBtn

                     testType:[NSString stringWithFormat:@"%ld", (long)currentBtn.tag]];

    }

    /**

     *  获取用户手势点所在cell的下标,同时判断手势点是否超出tableview的范围

     */

    - (BOOL)getShouldShowRectAndIndexPathWithLocation:(CGPoint)location

    {

        // 坐标点的转化,

        CGPoint tableLocation = [self.view convertPoint:location toView:_tableView];

        selectedPath = [_tableView indexPathForRowAtPoint:tableLocation];

        // 如果selctedPath是nil,则说明越界

        if (!selectedPath)

        {

            return NO;

        }

        // 计算弹出视图的初始位置

        sourceRect = CGRectMake (0, NavBarH + StatusBarH + selectedPath.section * FITHEIGHT (239),

                                 kScreenW, FITHEIGHT (209));

        // 如果row越界了,返回NO 不处理peek手势

        return (selectedPath.section >= (_buttons.count)) ? NO : YES;

    }

    @end

    /**

     *  详情结果页面

     */

     .h中

    #import <UIKit/UIKit.h>

    @interface SVDetailViewCtrl : SVViewController <UIPreviewActionItem>

    .m中

    /**

     *  3D Touch 上移显示的视图

     */

    - (NSArray<id<UIPreviewActionItem>> *)previewActionItems

    {

        // 如果testType不为空,说明是从当前结果页面跳转过来的,所以不需要显示删除

        if (testType && ![testType isEqualToString:@""])

        {

            return nil;

        }

        // 实现删除当前结果功能

        UIPreviewAction *delAction = [UIPreviewAction

        actionWithTitle:I18N (@"Delete")

                  style:UIPreviewActionStyleDefault

                handler:^(UIPreviewAction *_Nonnull action, UIViewController *_Nonnull previewViewController) {

                  SVInfo (@"删除当前结果,testId=%lld", testId);

                  //从数据库中删除

                  [_db

                  executeUpdate:[NSString

                                stringWithFormat:@"delete from SVSummaryResultModel where testId=%lld;", testId]];

                  //从数据库中删除

                  [_db

                  executeUpdate:[NSString

                                stringWithFormat:@"delete from SVDetailResultModel where testId=%lld;", testId]];

                  // 创建一个消息对象

                  NSNotification *notice =

                  [NSNotification notificationWithName:@"reloadResult" object:nil userInfo:nil];

                  //发送消息

                  [[NSNotificationCenter defaultCenter] postNotification:notice];

                }];

        //想要显示多个就定义多个 UIPreviewAction

        NSArray *actions = @[delAction];

        return actions;

    }

    @end

  • 相关阅读:
    Gradle 配置国内镜像
    Spring_Boot 简单例子
    IDEA中代码不小心删除,或者改了半天想回退到某个特定时间怎么办?
    Java 装饰模式
    Spring中 aop的 xml配置(简单示例)
    Spring使用@AspectJ开发AOP(零配置文件)
    Redis 的简单运算
    Redis 安装 与 使用
    touch-action属性引起的探索
    select下拉框的探索(<option></option>标签中能嵌套使用其它标签吗)
  • 原文地址:https://www.cnblogs.com/wangbinios/p/5509993.html
Copyright © 2011-2022 走看看