如何使用Interface Builder设置UIScreenEdgePanGestureRecognizer?

时间:2014-10-08 12:32:13

标签: ios objective-c xcode interface-builder

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

以下是重现的步骤:

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

enter image description here

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

结果代码如下:

Code example

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

我有什么遗失的吗?

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

7 个答案:

答案 0 :(得分:24)

我设置了一个项目来测试您的问题,并发现您遇到的同样问题。以下是我设置测试的场景:

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

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

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

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

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
@end

在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

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

答案 1 :(得分:7)

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

edgeGestureRecognizer.delegate = self

提示:不要忘记将 UIGestureRecognizerDelegate 协议添加到您的班级。否则,您会在{{1}}

收到错误消息

答案 2 :(得分:6)

它可以被视为一个错误,但实际上,这是一个有用的东西:

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

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

此要求仅适用于UIScreenEdgePanGestureRecognizer,因此我认为Xcode为什么会出错,必须将其实现为正常序列,alloc-&gt; init-&gt; attach-&gt;设置值。它适用于所有其他GestureRecongnizer,但不适用于UIScreenEdgePanGestureRecognizer。

答案 3 :(得分:3)

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)")
}

答案 4 :(得分:2)

要确保多个手势识别器可以协同工作,您必须实现方法shouldRecognizeSimultaneouslyWithGestureRecognizer并返回true:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

很抱歉Swift代码,但你应该明白这一点。

即使您使用单个手势识别器,也必须实现此方法,因为该视图可以拥有自己的(系统)识别器,例如MKMapView

答案 5 :(得分:2)

似乎Xcode 6.4的界面构建器和Swift中存在一个错误。此外,Thomas LIU的回答也是正确的:似乎有必要在代码中设置.edge属性,而不是使用Interface Builder。

即使IB中有边缘复选框,它们似乎也会被忽略。

我这样解决了: 按住Ctrl键并从手势识别器拖动到viewController类以创建IBOutlet:

class ViewController: UIViewController {
    @IBOutlet var leftEdgeGestureRecognizer: UIScreenEdgePanGestureRecognizer!

然后,在viewDidLoad中:

leftEdgeGestureRecognizer.edges = .Left

最后,从识别器中按住Ctrl键拖动以创建IBAction

@IBAction func swipeFromLeft(sender: AnyObject) {
        print("===> Swipe from left edge.\n")
}

答案 6 :(得分:1)

长期面对同样的问题。它是一个xcode错误,最好以编程方式添加它。