2016-05-14 3 views
3

У меня есть tableView с 3 статическими ячейками, каждая ячейка содержит подвью с ярлыками, отображающими нужный текст, что я хочу добиться, чтобы ориентация программно вращалась из Portrait на Пейзаж, когда пользователь нажимает на любое из трех подзонов.Как реализовать распознаватель жестов для нескольких подзонов с помощью Swift

Я получил его для первого подсмотра. Однако, когда я пытаюсь добавить один и тот же признак распознавания жестов к другим подзонам, он по-прежнему работает только для одного подзаголовка. Пожалуйста, сообщите, что мне не хватает? Спасибо за любой вклад.

Портрет:

enter image description here

Пейзаж

enter image description here

Table View Controller Код:

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") 
} 

Теперь я могу использовать каждый отдельный вид, а ориентация будет программно вращаться от Portrait to Landscape.

+0

Обратите внимание, что вы можете добавлять распознаватели жестов в раскадровках или xib-файлах и подключать их туда (подключая их к просмотрам и подключая действие/действие, которое запускается.) Таким образом, вам не нужен специальный код. –

2

, когда я пытаюсь добавить один и тот же жест Tap распознавателя к другому подобозрению он все еще работает только один подвид

Вы ответили на свой вопрос красиво. Вы не можете сделать это:

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

Вместо этого, вы должны сделать три различных крана жест распознавателей и добавить один к каждому зрения.

1

Как говорит Мэтт, распознаватель жестов работает только с одним видом. Единственный способ, с помощью которого распознаватель жестов может работать с несколькими видами, заключается в том, чтобы прикрепить его к супервизу, а затем написать дополнительный код, который определяет, какой из ваших подзонов (если они есть) ударил. Это обычно больше проблем, чем того стоит, и вам лучше просто создать отдельный распознаватель жестов для каждого представления.

В случае, когда я нашел, где полезно прикреплять распознаватель жестов к супервизу, позволяет пользователю нажать на вид, в котором анимируется позиция. Признаки распознавания жестов не обрабатывают позиционную анимацию, поэтому вы должны сделать это сами.

Смежные вопросы