2014-10-08 158 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") 
} 
相關問題