2016-05-14 80 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

马特说,手势识别器只适用于一个单一的视图。你可以用多个视图点击手势识别的唯一途径是将其安装到上海华,然后写算出它击中,你的子视图(如果有的话)额外的代码。但是,这通常比它的价值更麻烦,而且最好为每个视图创建一个单独的手势识别器。

如果我发现将手势识别器附加到超级视图有用的地方是让用户点击位置正在动画的视图。手势识别器不处理位置动画,所以你必须自己做。