2016-05-14 75 views
3

我有一個的tableView 3個靜格,每格包含顯示所需的文本標籤子視圖,我想要做到的是有方向從縱向編程旋轉當用戶點擊3個子視圖中的任何一個時,可以進入橫向模式。如何實現多個子視圖點擊手勢識別與斯威夫特

我得到了它的第一個子視圖的工作。但是,當我嘗試將其他子視圖添加到同一個Tap手勢識別器時,它仍然只適用於一個子視圖。請指教,我錯過了什麼?感謝您的任何意見。

人像:

enter image description here

景觀

enter image description here

表視圖控制器代碼:

import UIKit 

class SampleTableViewController: UITableViewController { 

    @IBOutlet weak var newYorkViewWrapper: UIView! 
    @IBOutlet weak var sanFranciscoViewWrapper: UIView! 
    @IBOutlet weak var chicagoViewWrapper: UIView! 

    //Vars 
    let tapRec = UITapGestureRecognizer() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     print("Sample view rendered.") 


     //Tap gesture 
     tapRec.addTarget(self, action: "tappedView") 
     newYorkViewWrapper.addGestureRecognizer(tapRec) 
     newYorkViewWrapper.userInteractionEnabled = true 
     sanFranciscoViewWrapper.addGestureRecognizer(tapRec) 
     sanFranciscoViewWrapper.userInteractionEnabled = true 
     chicagoViewWrapper.addGestureRecognizer(tapRec) 
     chicagoViewWrapper.userInteractionEnabled = true 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    //-------------------------------------------------------- 
    // MARK: Hide status bar 
    //-------------------------------------------------------- 
    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    func tappedView(){ 
     let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
     UIDevice.currentDevice().setValue(value, forKey: "orientation") 
    } 

    //-------------------------------------------------------- 
    // MARK: View Orientation method 
    //-------------------------------------------------------- 
    override func shouldAutorotate() -> Bool { 
     return true 
    } 


} 

回答

0

我通過定義4個獨立UITapGestureRecognizer()的變量,如下所示,然後加入適當的手勢識別爲適當的視圖解決我自己的問題。

//Vars 
let tapRecForHistoryView = UITapGestureRecognizer() 
let tapRecForMissionView = UITapGestureRecognizer() 
let tapRecForServiceAreaView = UITapGestureRecognizer() 
let tapRecForServiceAreaMapView = UITapGestureRecognizer() 


override func viewDidLoad() { 
     super.viewDidLoad() 
     //Tap gesture 
     tapRecForHistoryView.addTarget(self, action: "tappedView") 
     tapRecForMissionView.addTarget(self, action: "tappedView") 
     tapRecForServiceAreaView.addTarget(self, action: "tappedView") 
     tapRecForServiceAreaMapView.addTarget(self, action: "tappedView") 
     historyViewWrapper.addGestureRecognizer(tapRecForHistoryView) 
     historyViewWrapper.userInteractionEnabled = true 
     missionViewWrapper.addGestureRecognizer(tapRecForMissionView) 
     missionViewWrapper.userInteractionEnabled = true 
     serviceAreaViewWrapper.addGestureRecognizer(tapRecForServiceAreaView) 
     serviceAreaViewWrapper.userInteractionEnabled = true 
     serviceAreaMapWrapper.addGestureRecognizer(tapRecForServiceAreaMapView) 
     serviceAreaMapWrapper.userInteractionEnabled = true 
    } 

//-------------------------------------------------------- 
// MARK: Local Methods 
//-------------------------------------------------------- 
func tappedView(){ 
    let value = UIInterfaceOrientation.LandscapeLeft.rawValue 
    UIDevice.currentDevice().setValue(value, forKey: "orientation") 
} 

我現在可以點擊每個單獨的視圖,方向將以編程方式從縱向旋轉到橫向。

+0

注意,您可以在故事板或XIB文件添加手勢識別和鉤他們那裏(他們連接到的意見和掛鉤目標/行動觸發。)這樣,你不需要自定義代碼。 –

2

當我嘗試同樣的點擊手勢識別器添加到它仍然只適用於一個子視圖的其他子視圖

你精美回答了你自己的問題。你可以這樣做:

newYorkViewWrapper.addGestureRecognizer(tapRec) 
    sanFranciscoViewWrapper.addGestureRecognizer(tapRec) 
    chicagoViewWrapper.addGestureRecognizer(tapRec) 

相反,你必須做出三種不同自來水手勢識別,並添加一個到每個視圖。

1

馬特說,手勢識別器只適用於一個單一的視圖。你可以用多個視圖點擊手勢識別的唯一途徑是將其安裝到上海華,然後寫算出它擊中,你的子視圖(如果有的話)額外的代碼。但是,這通常比它的價值更麻煩,而且最好爲每個視圖創建一個單獨的手勢識別器。

如果我發現將手勢識別器附加到超級視圖有用的地方是讓用戶點擊位置正在動畫的視圖。手勢識別器不處理位置動畫,所以你必須自己做。