【问题标题】:UITapGestureRecognizer not working for specific [UIView] arrayUITapGestureRecognizer 不适用于特定的 [UIView] 数组
【发布时间】:2016-11-10 00:27:32
【问题描述】:

我有以下代码。它是用于菜单的第三方库(名为 CarbonKit)。当我尝试选择特定段(选项卡)并添加手势识别器时,它不起作用。任何想法我做错了什么?

要明确的是,我在handleTap中放了一个断点,它甚至没有进入函数。

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.userInteractionEnabled = true
        let tgr : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(OverviewFolder.handleTap(_:)))
        // segment 2 (categories)
        carbonTabSwipeNavigation.carbonSegmentedControl?.segments![2].userInteractionEnabled = true
        carbonTabSwipeNavigation.carbonSegmentedControl?.segments![2].addGestureRecognizer(tgr)
}

 // tap
    func handleTap(gestureRecognizer : UITapGestureRecognizer){
        let test = carbonTabSwipeNavigation.currentTabIndex
        if test == 2 {
            print("second item tapped")
        }
    }

【问题讨论】:

  • 添加手势时是否检查过carbonSegmentedControl 是否不为零?你还在使用 Swift 2 还是 Swift 3?
  • @alexburtnik 我正在使用 Swift 2.3,并且 carbonSegmentedControl 不为零,它返回 Optional(>)
  • 几个想法。一、什么是carbonTabSwipeNavigation?接下来,假设 carbonSegmentedControl 是您的 UISegmentedControl,您为什么要尝试向特定按钮添加点击手势?它已经具有内置水龙头。您不能简单地针对 UISegmentedControl.valueChanged() 进行编码并检查 selectedSegmentIndex 吗?
  • @dfd 有什么办法可以使用内置的水龙头吗? segmentedcontrol 确实是 UISegmentedControl
  • 你添加了gesturerecogniserdelegate吗?

标签: ios swift uiview uigesturerecognizer uitapgesturerecognizer


【解决方案1】:

如果第 3 方 UISegmentedControl 与通用控件类似,则您已经拥有所需的一切。这是我的一些代码。如果您使用的是 IB,请将控件连接到 IBAction。

let imageSegments = UISegmentedControl (items: ["Original","Stained"])

override func viewDidLoad() {
    super.viewDidLoad()
    imageSegments.tintColor = UIColor.yellow
    imageSegments.selectedSegmentIndex = 1
    imageSegments.addTarget(self, action: #selector(changeImageView), for: .valueChanged)
    view.addSubview(imageSegments)
}

func changeImageView() {
    switch imageSegments.selectedSegmentIndex {
    case 0:
        imageView.image = imgOriginal
    case 1:
        imageView.image = imgEdited
    default:
        break
    }
    imageView.setNeedsDisplay()
}

【讨论】:

  • 当我再次按下我已经按下的部分时,这不起作用(那是我真正需要它来向我发送更改的时刻)。有什么办法可以做到这一点?
  • 原因在于分段控件应该如何操作。我现在看到了你的问题。我的猜测——只是猜测——是你遇到了冲突。也就是说, UISegmentedControl 的“开箱即用”功能在响应者链上比点击识别器(在您的原始问题中)更高,并且点击(1)在接收器中被“压制”或“取消” - UISegmentedControl - 因为您已经 使用该段,因此 (2) 该点击永远不会超出链中的位置。你唯一能做的就是重新思考,重新设计你的 UI 或子类化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2021-06-19
相关资源
最近更新 更多