如何使用Interface Builder设置UIScreenEdgePanGestureRecognizer?

j b*_*j b 20 xcode objective-c interface-builder ios

UIScreenEdgePanGestureRecognizer当我使用Interface Builder将它添加到我的视图控制器时,我无法开始工作,所以我在这里要求确定我是做错了还是Xcode中有错误.

以下是重现的步骤:

  • 使用iOS的"单一视图应用程序"模板创建一个新的Xcode项目.
  • UIView通过从Interface Builder中的对象库中拖动一个来添加到主视图控制器
  • UIScreenEdgePanGestureRecognizer通过从Interface Builder中的对象库中拖动一个来添加视图
  • 确保已启用手势识别器并选择了边缘:

在此输入图像描述

  • 打开类的助手编辑器,ViewController然后按住Ctrl键拖动UIScreenEdgePanGestureRecognizerViewController实现块,创建一个新的IBAction `在动作的方法体中添加一个断点,测试是否正在识别边缘平移手势

结果代码如下:

代码示例

如果我在我的设备上运行该应用程序(运行iOS 8.02的iPhone 6),当我进行边缘滑动时,断点不会被击中.

有什么我想念的吗?

更新:这是作为Apple的一个错误(rdar:// 18582306)于2014年10月8日提交的,但在Xcode 6.4(6E35b)中仍未解决

小智 24

我设置了一个项目来测试你的问题并发现了你所做的同样的问题.以下是我设置测试的场景:

  • 我完全按照您的方式使用Interface Builder来构建屏幕边缘手势.我的代码唯一不同的是我在选择器中放了一行代码,这样调试器就可以停止了.调试器无法完全停止,就像您找到的那样.

    -(void)handlePan:(id)sender
    {
        NSString *test = @"";
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后,我使用Interface Builder在同一视图上使用捏合手势创建了一个额外的手势,我能够让调试器在该选择器中停止.因此,Interface Builder似乎能够正确地构建其他手势.

  • 然后,我使用以下代码手动创建屏幕边缘手势,它按预期工作.

在ViewController.h文件中,我包含了UIGestureRecognizerDelegate.

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)

在ViewController.m文件中,我手动实现了手势.

#import "ViewController.h"

@interface ViewController ()

-(void)handlePan:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad 
{
    [super viewDidLoad];
    UIScreenEdgePanGestureRecognizer *pan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self
                                                                                              action:@selector(handlePan:)];
    [pan setEdges:UIRectEdgeLeft];
    [pan setDelegate:self];
    [self.view addGestureRecognizer:pan];
}

-(void)handlePan:(id)sender
{
    NSString *test = @"";
}

@end
Run Code Online (Sandbox Code Playgroud)

我最终得到了你所做的相同结论 - Interface Builder的UIScreenEdgePanGestureRecognizer实现似乎有问题.


Pet*_*ter 8

我在Xcode 7.0 Beta 4(7A165t)中尝试了它,它仍然是一个bug.通过Interface Builder添加屏幕边缘Pan Gesture识别器不会调用引用的IBAction,但是以编程方式添加它可以正常工作:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: "userSwipedFromEdge:")
        edgeGestureRecognizer.edges = UIRectEdge.Left
        edgeGestureRecognizer.delegate = self
        self.view.addGestureRecognizer(edgeGestureRecognizer)
    }

    func userSwipedFromEdge(sender: UIScreenEdgePanGestureRecognizer) {
        if sender.edges == UIRectEdge.Left {
            print("It works!")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

提示:不要忘记将UIGestureRecognizerDelegate协议添加到您的班级.否则你会收到错误edgeGestureRecognizer.delegate = self


小智 6

它可以被视为一个bug,但实际上,这里有用:

"在创建屏幕边缘平移手势识别器之后,在将手势识别器附加到视图之前,为edge属性指定适当的值."

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/index.html

此要求仅适用于UIScreenEdgePanGestureRecognizer,因此我认为这就是为什么Xcode使其出错,必须将其实现为正常序列,alloc-> init-> attach-> set value.它适用于所有其他GestureRecongnizer但不适用于UIScreenEdgePanGestureRecognizer.


Zel*_*lko 5

Xcode 并不总是一个好邻居。对不起。

override func viewDidLoad() {
    super.viewDidLoad()

    let panGesture = UIScreenEdgePanGestureRecognizer(target: self, action: "panAction:")
    panGesture.edges = .Left
    view.addGestureRecognizer(panGesture)
}


func panAction(sender: UIScreenEdgePanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)

    println("Trans:\(translation)")
}
Run Code Online (Sandbox Code Playgroud)