当我使用Interface Builder将其添加到我的视图控制器时,我无法使UIScreenEdgePanGestureRecognizer
工作,所以我在这里要求确定我是做错了还是有错Xcode中的错误。
以下是重现的步骤:
UIView
到主视图控制器UIScreenEdgePanGestureRecognizer
ViewController
课程的助理编辑器,然后从UIScreenEdgePanGestureRecognizer
到ViewController
的实施块按住Ctrl键拖动,以创建新的IBAction
`在动作的方法体中添加断点,以测试是否正在识别边缘平移手势结果代码如下:
如果我在我的设备上运行该应用程序(运行iOS 8.02的iPhone 6),当我进行边缘滑动时,断点不会被击中。
我有什么遗失的吗?
更新:这是作为Apple的一个错误(rdar:// 18582306)于2014年10月8日提交的,但仍未在Xcode 6.4(6E35b)中解决
答案 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;
此要求仅适用于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错误,最好以编程方式添加它。