HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – UIButton之外的TouchUpInside边界大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我现在正想要在 Swift下熟悉UIKit并找出以编程方式添加UI元素的最佳方法.然而,我发现触摸可以在按钮之外结束,它仍然开始注册为TouchUpInside事件.下面的ViewController来自单个视图应用程序,可以直接开始触摸,比如按钮17,在按钮18上结束它仍然有buttonAction()声明“按钮点击:17”.

知道我在这里缺少什么吗?
(编辑:这是在Xcode 6 beta 3 BTW下.)

// ViewController.swift

import UIKit

class ViewController: UIViewController {
    let scrollView:UIScrollView = UIScrollView()

    var GWIDTH:Float = 0.0
    var GHEIGHT:Float = 0.0


    override func viewDidLoad() {
        super.viewDidLoad()

        GWIDTH = self.view.bounds.size.width
        GHEIGHT = self.view.bounds.size.height

        scrollView.frame = CGRectMake(10,10,GWIDTH-10,GHEIGHT-20)
        scrollView.contentSize = CGSize(width:GWIDTH-20,height: 0)
        self.view.addSubview(scrollView)

        for currentTag in 1...30{
            var currentButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
            currentButton.frame = CGRectMake(100,scrollView.contentSize.height,100,50)
            currentButton.BACkgroundColor = UIColor.greenColor()
            currentButton.settitle("Test Button \(currentTag)",forState: UIControlState.Normal)
            currentButton.tag = currentTag
            currentButton.addTarget(self,action: "buttonAction:",forControlEvents: UIControlEvents.TouchUpInsidE)

            scrollView.addSubview(currentButton)
            scrollView.contentSize = CGSize(width:GWIDTH-20,height:2.0+currentButton.frame.size.height+currentButton.frame.origin.y)
        }//next
    }// end viewDidLoad()


    func buttonAction(sender:UIButton!){
        println("Button tapped: \(sender.tag)")
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    override func prefeRSStatusBarHidden() -> Bool {
        return true
    }
}

解决方法

好吧,我们花了很多时间来深入研究这个问题但是有一些有用的Obj-C链接……

UIControlEventTouchDragExit triggers when 100 pixels away from UIButton

How to correctly subclass UIControl?

http://www.bytearray.org/?p=5336(特别是第89行)

…而且由于触摸界面似乎行为是标准的(个人我本能地发现认区域过多但我确信Apple做了功课)并且可以通过子类化UIControl或询问位置来覆盖控制事件.

我选择了后者,这里是Swift中的一个实现:

// ViewController.swift

import UIKit

class ViewController: UIViewController {
    let buttonCount = 3

    override func viewDidLoad() {
        super.viewDidLoad()

        for currentTag:Int in 1...buttonCount{
            var currentButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
            currentButton.frame = CGRectMake(50,Float(currentTag*50),120,forState: UIControlState.Normal)
            currentButton.contentEdgeInsets = UIEdgeInsets(top:3,left:6,bottom:3,right:6)
            currentButton.tag = currentTag
            currentButton.addTarget(self,action: "btn_TouchDown:",forControlEvents: UIControlEvents.TouchDown)
            currentButton.addTarget(self,action: "btn_TouchDragExit:",forControlEvents: UIControlEvents.TouchDragExit)
            currentButton.addTarget(self,action: "btn_TouchUpInside:event:",forControlEvents: UIControlEvents.TouchUpInsidE)
            currentButton.sizeToFit()

            self.view.addSubview(currentButton)
        }//next
    }// end viewDidLoad()


    func btn_TouchDown(sender:UIButton!){
        println("TouchDown event: \(sender.tag)\n")
    }

    func btn_TouchDragExit(sender:UIButton!){
        println("TouchDragExit event: \(sender.tag)\n")
    }

    func btn_TouchUpInside(sender:UIButton!,event:UIEvent!){
        println("TouchUpInside event: \(sender.tag)")

        var currentTouch:CGPoint = event.allTouches().anyObject().LOCATIOnInView(sender)
        println( "Point: \(currentTouch.X),\(currentTouch.y)\n" )
        if currentTouch.x > sender.frame.width{return}
        if currentTouch.x < 0 {return}
        if currentTouch.y > sender.frame.height{return}
        if currentTouch.y < 0 {return}

        println("Event ended within frame!")
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    override func prefeRSStatusBarHidden() -> Bool {
        return true
    }
}

大佬总结

以上是大佬教程为你收集整理的ios – UIButton之外的TouchUpInside边界全部内容,希望文章能够帮你解决ios – UIButton之外的TouchUpInside边界所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。