2014-07-14 6 views
5

के बाहर TouchUpInside सीमाएं मैं वर्तमान में स्विफ्ट के तहत UIKit के साथ परिचित होने और प्रोग्रामिंग के यूआई तत्वों को जोड़ने का सबसे अच्छा तरीका काम करने के लिए तैयार हूं। हालांकि मुझे लगता है कि एक स्पर्श बटन के बाहर रास्ता समाप्त कर सकता है जिसमें यह अभी भी टचअप इनसाइड ईवेंट के रूप में पंजीकृत है। नीचे व्यू कंट्रोलर एक एकल दृश्य एप्लिकेशन से है और यह बटन 17 पर एक स्पर्श शुरू करने के लिए सीधा है, इसे बटन 18 पर समाप्त करें और अभी भी बटन एक्शन() घोषित करें "बटन टैप किया गया: 17"।UIButton

कोई विचार जो मैं यहां याद कर रहा हूं? (संपादित करें: यह Xcode 6 के तहत BTW है बीटा 3।)

// 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 
    } 
} 

उत्तर

6

ठीक है यह इस के तल लेकिन उपयोगी Obj सी लिंक के एक जोड़े को पाने के लिए खुदाई का एक उचित सा ले लिया है ...

UIControlEventTouchDragExit triggers when 100 pixels away from UIButton

How to correctly subclass UIControl?

http://www.bytearray.org/?p=5336 (विशेष रूप से लाइन 89)

... और ऐसा लगता है कि टच इंटरफ़ेस के कारण व्यवहार मानक है (व्यक्तिगत रूप से मैं सहज रूप से डिफ़ॉल्ट क्षेत्र को अत्यधिक खोजता हूं लेकिन मुझे यकीन है कि ऐप्पल ने अपना होमवर्क किया है) और इसे उप-वर्गीकरण यूआईसींट्रोल द्वारा नियंत्रित किया जा सकता है या नियंत्रण ईवेंट की स्थिति पूछताछ की जा सकती है।

मैं बाद के लिए निकल गए थे और यहाँ एक कार्यान्वयन स्विफ्ट में विशेष रूप से है है:

// 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, 50) 
      currentButton.backgroundColor = UIColor.greenColor() 
      currentButton.setTitle("Test Button \(currentTag)", 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 
    } 
}