2016-07-10 7 views
-1

私は六角形に基づいて簡単なゲームを作っています。私はまさに私がCAShapeLayer sとそれらを望むように六角形を描くことができた形のUIButtonを作成するCAShapeLayer

enter image description here

が、私は彼らがクリッカブルしたいのです:ここでは次のようになります。要するに、私はそれらを何とかUIButtonsにキャストしたいので、どれがtouchUpInsideで選択されたかを調べることができます。私がそれをやっていると考えることができるもう一つの方法は、軌道に触れ、それらがタグ付きの形になっているかどうかをチェックすることですが、複雑になるようです。以下は私のコードです:

 let screenSize: CGRect = UIScreen.mainScreen().bounds 
     let screenWidth = screenSize.width 
     let screenHeight = screenSize.height 

     let radius : CGFloat = screenWidth/6 

     var c = 0 

     var counter = 0 

     for j in 1...6 { 
      for i in 1...3 { 

       for x in 1...2 { 

        var center = CGPoint(x: CGFloat((i-1)*2)*radius+CGFloat(i-1)*radius, y: CGFloat((j-1)*2)*radius) 

        if (x==2) { 
         center.x = center.x+1.5*radius 
         center.y = center.y+radius 
        } 



        let shape = CAShapeLayer() 
        view.layer.addSublayer(shape) 
        shape.opacity = 0.5 
        shape.lineWidth = 2 
        shape.lineJoin = kCALineJoinMiter 
        shape.strokeColor = UIColor(hue: 0.786, saturation: 0.79, brightness: 0.53, alpha: 1.0).CGColor 
        shape.fillColor = UIColor(hue: 0.786, saturation: 0.15, brightness: 0.89, alpha: 1.0).CGColor 


        let path = UIBezierPath() 
        path.moveToPoint(CGPointMake(center.x-radius, center.y)) 
        path.addLineToPoint(CGPointMake(center.x-radius/2, center.y-radius)) 
        path.addLineToPoint(CGPointMake(center.x+radius/2, center.y-radius)) 
        path.addLineToPoint(CGPointMake(center.x+radius, center.y)) 
        path.addLineToPoint(CGPointMake(center.x+radius, center.y)) 
        path.addLineToPoint(CGPointMake(center.x+radius/2, center.y+radius)) 
        path.addLineToPoint(CGPointMake(center.x-radius/2, center.y+radius)) 

        path.closePath() 
        shape.path = path.CGPath 



       } 


      } 

     } 

答えて

2

私はそれをやって考えることができ、他の方法では、トラックのタッチで、彼らはタグ付き形状にあったかどうかを確認、それは複雑な

オーケーへの道ですしかし、問題はレイヤーでこれを行うことを選択したことであり、レイヤーはタッチを全く検出しないため、他の選択肢があなたに公開されているかどうかを知ることは難しいです。レイヤーをボタンに「キャスト」することはできません。ボタンまたはビュー上でタップを検出するビューが必要な場合は、ボタンまたはビューのレイヤーに使用する必要があります。

たとえば、カスタムUIViewを使用する場合は、シェイプレイヤーをレイヤーとして使用し、ヒットテストを実装してタップがシェイプレイヤーの六角形パスに収まるかどうかを判断できます。ここでは、始めるために例を示します

class HexButton: UIView { 

    var path: UIBezierPath! 

    override class func layerClass() -> AnyClass { 
     return CAShapeLayer.self 
    } 

    override init(frame: CGRect) { 
     super.init(frame:frame) 
     self.finishInitialization() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
     self.finishInitialization() 
    } 

    func finishInitialization() { 
     let shape = self.layer as! CAShapeLayer 
     shape.opacity = 0.5 
     shape.lineWidth = 2 
     shape.lineJoin = kCALineJoinMiter 
     shape.strokeColor = UIColor(hue: 0.786, saturation: 0.79, brightness: 0.53, alpha: 1.0).CGColor 
     shape.fillColor = UIColor(hue: 0.786, saturation: 0.15, brightness: 0.89, alpha: 1.0).CGColor 

     let center = CGPoint(x:self.bounds.midX, y: self.bounds.midY) 
     let radius = self.bounds.width/2.0 

     let path = UIBezierPath() 
     path.moveToPoint(CGPointMake(center.x-radius, center.y)) 
     path.addLineToPoint(CGPointMake(center.x-radius/2, center.y-radius)) 
     path.addLineToPoint(CGPointMake(center.x+radius/2, center.y-radius)) 
     path.addLineToPoint(CGPointMake(center.x+radius, center.y)) 
     path.addLineToPoint(CGPointMake(center.x+radius, center.y)) 
     path.addLineToPoint(CGPointMake(center.x+radius/2, center.y+radius)) 
     path.addLineToPoint(CGPointMake(center.x-radius/2, center.y+radius)) 

     path.closePath() 
     shape.path = path.CGPath 

     self.path = path 

    } 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     return self.path.containsPoint(point) ? self : nil 
    } 

} 

あなたがそのビューにタップジェスチャー認識を添付した場合、あなたはそれをタップが六角形の内側にある場合にのみ発火いることがわかります。

+0

お返事ありがとうございます!それは理にかなっている。シェイプレイヤーを使ってUIButtonを設定する方法はありますか?私はどのように六角形のUIButtonを作るつもりですか? – Antoine

+0

サンプルコードが追加されました。 – matt

関連する問題