繁体   English   中英

如何使用Swift为多个子视图实现点击手势识别器

[英]How to implement a tap gesture recognizer for multiple subviews with Swift

我有一个带有3个静态单元格的tableView,每个单元格都包含一个带有显示所需文本的标签的子视图,我想要完成的是当用户点击任意3个子视图时,以编程方式将方向从纵向旋转到横向。

我让它为第一个子视图工作。 但是,当我尝试将相同的Tap手势识别器添加到其他子视图时,它仍然只适用于一个子视图。 请指教,我错过了什么? 感谢您的任何意见。

肖像:

在此输入图像描述

景观

在此输入图像描述

表视图控制器代码:

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
    }


}

当我尝试将相同的Tap手势识别器添加到其他子视图时,它仍然只适用于一个子视图

你已经很好地回答了自己的问题。 你不能这样做:

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

相反,您必须制作三个不同的敲击手势识别器,并为每个视图添加一个

正如Matt所说,手势识别器仅适用于单一视图。 使用多个视图可以使轻击手势识别器工作的唯一方法是将其附加到超级视图,然后编写额外的代码来确定它击中了哪些子视图(如果有的话)。 但这通常比它的价值更麻烦,而且你最好只为每个视图创建一个单独的手势识别器。

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

我通过定义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")
}

我现在可以点击每个单独的视图,并且方向将以编程方式从纵向旋转到横向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM