2014-10-08 85 views
17

我不能让​​在我使用Interface Builder将其添加到视图控制器时创建,因此我在这里要求确定我是否做错了某些事情,或者如果在Xcode中存在错误。如何使用Interface Builder设置UIScreenEdgePanGestureRecognizer?

下面是步骤来重现:

  • 创建使用适用于iOS的“单一视图应用程序”模板创建一个新的Xcode项目。
  • 添加UIView到主视图控制器通过在界面生成拖动一个从对象库
  • 添加​​到视图通过在界面生成器拖动一个从对象库
  • 确保手势识别器被使能和边缘选择:

enter image description here

  • 打开为助手编辑类,然后从​​CTRL-拖动到ViewController的实现块以创建新的IBAction `添加断点在该操作的方法体,以测试边缘平移姿势被识别

产生的代码如下:

Code example

如果我的设备(运行iOS 8.02 iPhone 6)当我做边缘滑动断点不被打到上运行的应用程序。

有什么我失踪了吗?

UPDATE:这是申请作为一个bug与苹果(rdar:// 18582306)在2008年10月2014年仍然没有在Xcode 6.4(6E35b)解决

回答

23

我建立了一个项目来测试你的问题,发现你所做的同样的问题。下面是我设置为测试场景:我确实做到了像你一样,使用Interface Builder,建立屏幕边缘手势

  • 。我的代码唯一的区别是我把一行代码放在选择器中,这样调试器就会停下来。调试器未能按照您找到的完全停止。

    -(void)handlePan:(id)sender 
    { 
        NSString *test = @""; 
    } 
    
  • 然后,我创建了使用上的使用界面生成器相同的观点缩放手势额外的姿态,我能得到调试器是选择内停止。所以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 

我结束了与你做了同样的结论 - 似乎有一些错误的界面生成器的实施UIScreenEdgePanGestureRecognizer的。

+1

想补充一点,我在模拟器和我的设备上测试了相同的结果 - 对IB执行的手势没有响应。 – sunergeos 2014-10-08 15:41:52

+0

感谢您抽出宝贵时间对此进行测试。我现在已经向Apple提交了一个错误报告:http://openradar.io/18582306 – 2014-10-08 15:45:26

+0

我已经将它标记为可接受的答案,因为它确认我没有做任何不正确的事情,并且Xcode的行为并不像预期的那样。 – 2014-10-08 15:46:39

2

为了确保多手势识别器可以协同工作,你必须实现该方法shouldRecognizeSimultaneouslyWithGestureRecognizer并返回true:

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

对不起,雨燕代码,但你应该明白我的意思。

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

+0

不幸的是,执行“手势识别器:shouldRecognizeSimultaneouslyWithGestureRecognizer:'委托方法并使'ViewController'成为'UIScreenEdgePanGestureRecognizer'的委托没有任何区别。仍然没有检测到边缘泛。普通的'UIPanGestureRecognizer'工作正常。想想我可能会提出一个错误报告。 – 2014-10-08 15:31:30

2

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

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

5

它可以被看作是一个错误,但实际上,这里是一些有用的东西:

“创建屏幕边缘平移手势识别器后,手势识别器连接到您的视图之前指定一个适当的值边缘属性“。

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

此要求仅适用于UIScreenEdgePanGestureRecognizer,所以我认为这就是为什么Xcode中做出错,它必须被实现为正常顺序,alloc-> INIT-> attach->设定值。它将适用于所有其他的GestureRecongnizer,但不适用于UIScreenEdgePanGestureRecognizer。

6

我已经在Xcode 7.0 Beta 4(7A165t)中试过了,它仍然是一个错误。通过添加界面生成器屏幕边缘移动手势识别器不会调用引用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!") 
     } 
    } 
} 

提示:不要忘记将UIGestureRecognizerDelegate协议添加到你的班。否则,你会得到一个错误在edgeGestureRecognizer.delegate = self

2

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

尽管IB中有边框复选框,但它们似乎被忽略。

我解决这样说:从手势识别到ViewController类 按住Ctrl键来创建一个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") 
} 
相关问题