簡體   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