j b*_*j b 20 xcode objective-c interface-builder ios
UIScreenEdgePanGestureRecognizer当我使用Interface Builder将它添加到我的视图控制器时,我无法开始工作,所以我在这里要求确定我是做错了还是Xcode中有错误.
以下是重现的步骤:
UIView通过从Interface Builder中的对象库中拖动一个来添加到主视图控制器UIScreenEdgePanGestureRecognizer通过从Interface Builder中的对象库中拖动一个来添加视图
ViewController然后按住Ctrl键拖动UIScreenEdgePanGestureRecognizer到ViewController实现块,创建一个新的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实现似乎有问题.
我在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属性指定适当的值."
此要求仅适用于UIScreenEdgePanGestureRecognizer,因此我认为这就是为什么Xcode使其出错,必须将其实现为正常序列,alloc-> init-> attach-> set value.它适用于所有其他GestureRecongnizer但不适用于UIScreenEdgePanGestureRecognizer.
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)
| 归档时间: |
|
| 查看次数: |
18267 次 |
| 最近记录: |