2016-07-10 4 views
-1

Итак, я делаю простую игру на основе шестиугольников. Вот как это выглядит:Создание UIButton с формой CAShapeLayer

enter image description here

Я сумел нарисовать шестиугольники именно так, как я хочу их CAShapeLayer с, но я хотел бы, чтобы сделать их интерактивными. Короче говоря, я хотел бы как-то отбросить их в 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

Смежные вопросы