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

时间:2016-05-14 23:45:32

标签: ios swift uitableview uigesturerecognizer

我有一个包含3个静态单元格的tableView,每个单元格都包含一个带有显示所需文本的标签的子视图,我想要完成的是当用户点击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
    }


}

3 个答案:

答案 0 :(得分:2)

  

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

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

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

相反,您必须制作三个不同的点击手势识别器,并将一个添加到每个视图中。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我通过定义4个单独的UITapGestureRecognizer()变量解决了我自己的问题,如下所示,然后将适当的手势识别器添加到适当的视图中。

$s3 = Aws\S3\S3Client::factory();
$bucket = getenv('S3_BUCKET')?: die('No "S3_BUCKET" config var in found in env!');


$s3->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'myvideo.mp4',
    'Body'   => 'http://example.fr/video.mp4'
));

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