swift的手势

作者: 光明程辉 | 来源:发表于2018-07-07 11:50 被阅读14次

    swift的手势点击事件比Objective-C简洁多了。今天写了个小需求:
    点击不同的label就改变对应的标签颜色。

    好的,我们看一下效果图:


    获取点击不同的label.png

    首先,看一下苹果官网的说明:
    Code that handles tap gestures should therefore test for the state of the gesture, for example:

    func handleTap(sender: UITapGestureRecognizer) {
      if sender.state == .ended {
        // handling code
      }
    }
    

    具体的子类如下:UIGestureRecognizer
    UITapGestureRecognizer
    UIPinchGestureRecognizer
    UIRotationGestureRecognizer
    UISwipeGestureRecognizer
    UIPanGestureRecognizer
    UIScreenEdgePanGestureRecognizer
    UILongPressGestureRecognizer

    The class defines a set of common behaviors that can be configured for all concrete gesture recognizers.(就是实现对某些行为的更细粒度的自定义)

    UIGestureRecognizerUIGestureRecognizerDelegate

    手势识别器根据对特定视图和所有视图的子视图进行经过测试的触摸进行操作。因此必须与该观点相关联。要建立该关联,您必须调用该UIView方法。手势识别器不参与视图的响应者链。addGestureRecognizer(_:)

    手势识别器具有与其相关联的一个或多个目标 - 动作对。如果存在多个目标 - 动作对,则它们是离散的,而不是累积的。对手势的识别导致向每个关联对的目标发送动作消息。调用的操作方法必须符合以下签名之一:

    @IBAction func myActionMethod()
    @IBAction func myActionMethod(_ sender: UIGestureRecognizer)
    

    我大概就说这么一些,有兴趣就去官网研究。
    回到我们的主题:

    1、给label 添加手势

    label.isUserInteractionEnabled = true
                let tapGes = UITapGestureRecognizer(target: self, 
      action: #selector(self.titleLabelClick(tapGes: )))
    

    2、 添加

    // 添加 
    label.addGestureRecognizer(tapGes)
    

    3、封装 点击获取不同的label的tag值?
    3.1 添加标题下标索引为0

    // 标题下标索引为0
    var currentIndex : Int = 0
    

    3.2 这里主要 是监听 点击事件 获取对应的tag

    // MARK: -- 监听title 的点击
    extension PageTitleView{
    // 点击事件 需要添加 @objc
    @objc func titleLabelClick(tapGes:UITapGestureRecognizer){
        // 1、获取当前label
        guard let currentLabel = tapGes.view as? UILabel else {
            return
        }
        
        // 2、获取之前的label
        let oldLabel = titleLabels[currentIndex]
        // 3、切换文字的颜色
        currentLabel.textColor = UIColor.orange
        oldLabel.textColor = UIColor.darkGray
        // 3、保存最新label 的下标值
        currentIndex = currentLabel.tag
    }
    
    }
    

    敲黑板:

    看完上面的代码你有没有发现,我的代码是写在一个 extension 里面的。
    category 和 extension 很相似。
    Objective-C的category需要写扩展名,而swift不需要,只需要一个extension。

    extension主要是提高代码的可读性, 对程序运行性能不会有影响. 一般在写OC时, 习惯用#pragma mark来标记一部分代码, 在接触swift项目时, 包括apple的工程师都会用extension把功能相似的代码方法放在一起, 方便团队之间的合作.

    把同一功能类型 **(UI布局、属性计算、代理方法、事件监听) ** 的代码用extension分割, 便于后期的代码维护. 如果同一文件下代码过多, 可以用extension拆分成多个文件, 使每一个extension文件功能明确,代码结构更加清晰整洁.

    所以swift中建议使用extension进行功能性 划分 , 但不代表你可以乱用,以服务于整洁,可读性强易于维护为原则。

    相关文章

      网友评论

        本文标题:swift的手势

        本文链接:https://www.haomeiwen.com/subject/hdtwuftx.html