2016-09-30 6 views
-2
class ViewController: UIViewController { 

    let manImage = UIImage(named: "man.png") 

    let button = UIButton() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     button.setBackgroundImage(manImage, forState: .Normal) 
     button.addTarget(self, action: "activate", forControlEvents: .TouchUpInside) 
     button.translatesAutoresizingMaskIntoConstraints = false 
     self.view.addSubview(button) 
     self.view.addConstraint(NSLayoutConstraint(
      item: button, 
      attribute: .Leading, 
      relatedBy: .Equal, 
      toItem: view, 
      attribute: .Leading, 
      multiplier: 1, 
      constant: 0)) 
     self.view.addConstraint(NSLayoutConstraint(
      item: button, 
      attribute: .CenterY, 
      relatedBy: .Equal, 
      toItem: view, 
      attribute: .CenterY, 
      multiplier: 1, 
      constant: 0)) 

     startAnimating() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func startAnimating() { 
     UIView.animateWithDuration(10, delay: 0, options: .CurveLinear, animations: { 
      self.button.frame.origin.x = self.button.frame.origin.x - 150}, completion: nil) 
    } 

    func activate() { 
     print(button.center.x) 
    } 

} 

移動中にボタンをタッチするにはどうすればよいですか?ヒットテストの更新とQuartzキットの使用については何かがありますが、抜粋が含まれているため、その回答を理解できませんでした。誰かが実際のサンプルコードを含む最も単純な答えを提供してくれますか?移動ボタンにはどのように触れますか?

ありがとうございます。

編集:ボタンが表示される場所ではなく、画像が現在表示されているボタンに触れることができます。

+0

なぜあなたは透過性を使用してこれをハックしようとしていますか?あなたが解決しようとしている実際の問題は何ですか?おそらくそれを解決するためのより良い(適切な)方法があります。 – brandonscript

+0

私はStackでそれを見て、upvotesとコメントの推奨を得ました。あなたが本当にそれをお勧めしたら、私は全体の質問を変更します。 – ludluck

+0

私はあなたの問題があなたが解決しようとしていることを理解していないと言っています。あなたが達成しようとしていることが明確であるように、あなたの質問を書き換えることから始めます。 – brandonscript

答えて

2

.AllowUserInteractionをアニメーションのオプションの1つとして追加する必要があります。

は、あなたはそれがアニメーションの終わりになると位置のボタンをクリックできるようになる。この

UIView.animateWithDuration(10, delay: 0, options: [.CurveLinear, .AllowUserInteraction], animations: { 

これでこの行

UIView.animateWithDuration(10, delay: 0, options: .CurveLinear, animations: { 

を交換してください。

アニメーション中に現在の状態でボタンをクリックするには、touchesBeganメソッドをオーバーライドし、ボタンのpresentationLayerをタッチ位置にhitTestに使用する必要があります。
クラスにこのコードを追加します。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    guard let touch = touches.first else { 
     return 
    } 
    let touchLocation = touch.locationInView(self.view) 
    if self.button.layer.presentationLayer()?.hitTest(touchLocation) != nil { 
     activate() 
    } 
} 

そして、あなたがpresentationLayerframe使用できるボタンの現在の位置にアクセスするには、このようなあなたのactivate()方法を変更します。

func activate() { 
    if let presentationLayer = button.layer.presentationLayer() { 
     print(presentationLayer.frame.midX) 
    } else { 
     print(button.center.x) 
    } 
} 

* iOS 10の時点では、.AllowUserInteractionはアニメーション中の現在の状態でクリックさせるのに十分なので、touchesBeganとhitTestを使用する必要はありません。

+0

多分、私の質問では具体的ではありませんでしたが、問題は、ボタンの相互作用は、ボタンの画像が現在ある場所ではなく、ボタンの場所でのみ発生するということです。 – ludluck

+0

@ludluck最新の回答をご覧ください。 –

+0

私はあなたが言ったことを正確に行い、それは美しくあなたに感謝します。しかしあなたの*コメントはどういう意味ですか? iOS 10がリリースされたら、元のソリューションを使うだけです。それははるかに簡単になります!編集:それはすでにリリース、分待ってください。 – ludluck

関連する問題