2015-04-21 36 views
5

Tôi khá mới để phát triển iOS (vì vậy xin vui lòng tha thứ cho sự vô cảm của tôi - tôi đã xem ở khắp mọi nơi!), Và đang tìm cách tìm ra một cách để phát hiện một cú chạm trên CAShapeLayer. Cho đến nay, tôi đã đi qua hitTest. Có phải phương pháp tốt nhất là hitTest và nếu được sử dụng trong Swift, đặc biệt là với CAShapeLayer thì sao? Ngoài ra, nếu tôi có nhiều CAShapeLayers, làm thế nào tôi có thể sử dụng phương thức hitTest để chỉ riêng chúng?Phát hiện một vòi nước trên CAShapeLayer trong Swift?

Đây là cách tôi tạo ra CAShapeLayer:

let newBounds = CGRect(x: 0, y: 0, width: 200, height: 200) 
    let newShape = CAShapeLayer() 
    newShape.bounds = newBounds 
    newShape.position = view.center 
    newShape.cornerRadius = newBounds.width/2 
    newShape.path = UIBezierPath(ovalInRect: newShape.bounds).CGPath 

    newShape.lineWidth = 42 
    newShape.strokeColor = UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0).CGColor 
    newShape.fillColor = UIColor.clearColor().CGColor 

    newShape.strokeStart = 0.2 
    newShape.strokeEnd = 0.4 

    view.layer.addSublayer(newShape) 

Trả lời

7

Heres imo cách tốt nhất để làm những gì bạn muốn đạt được:

// First add the shapelayer 
let layer = CAShapeLayer() 
layer.anchorPoint = CGPointZero 
layer.path = UIBezierPath(ovalInRect: CGRect(x: 0, y: 0, width: 100, height: 200)).CGPath 
layer.bounds = CGPathGetBoundingBox(layer.path) // IMPORTANT, without this hitTest wont work 
layer.fillColor = UIColor.redColor().CGColor 
self.view.layer.addSublayer(layer) 


// Check for touches 
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    let point = touches.anyObject()!.locationInView(self.view) // Where you pressed 

    if let layer = self.view.layer.hitTest(point) as? CAShapeLayer { // If you hit a layer and if its a Shapelayer 
     if CGPathContainsPoint(layer.path, nil, point, false) { // Optional, if you are inside its content path 
      println("Hit shapeLayer") // Do something 
     } 
    } 
} 
+0

Tôi đã thử mã của bạn nhưng không có gì đang in trên bảng điều khiển khi tôi nhấn vào CAShapeLayer vì một số lý do. – John

+0

Chỉ cho tôi cách bạn tạo shapelayer đó – Arbitur

+0

Tôi đã đặt nó ở trên. – John

0

Sử dụng sau mã cho get liên lạc của CAShapeLayer.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch *touch in touches) { 
     CGPoint touchLocation = [touch locationInView:self.view]; 
     for (id sublayer in self.view.layer.sublayers) { 
      BOOL touchInLayer = NO; 
      if ([sublayer isKindOfClass:[CAShapeLayer class]]) { 
       CAShapeLayer *shapeLayer = sublayer; 
       if (CGPathContainsPoint(shapeLayer.path, 0, touchLocation, YES)) { 
        // Here your code for do any opration. 
        touchInLayer = YES; 
       } 
      } else { 
       CALayer *layer = sublayer; 
       if (CGRectContainsPoint(layer.frame, touchLocation)) { 
        // Touch is in this rectangular layer 
        touchInLayer = YES; 
       } 
      } 
     } 
    } 
} 
+0

Cảm ơn. Bạn có biết tôi có thể lấy mã này trong Swift không? – John

+0

Nope :-(cần thêm R & D làm việc cho –

+0

mà tôi khuyên hitTest trên này – Arbitur

1

Swift 4,

My UIImageView là có nhiều CAShapeLayer đối tượng, ở đây là làm thế nào tôi đã có thể để phát hiện các vòi trên chúng.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first 

     guard let point = touch?.location(in: imageView) else { return } 
     guard let sublayers = imageView.layer.sublayers as? [CAShapeLayer] else { return } 

     for layer in sublayers{ 
      if let path = layer.path, path.contains(point) { 
       print(layer) 
      } 
     } 
    } 

Ref

0

tôi đã sử dụng mã Arbitur và tôi đã có một số sai sót. Đây là mã tôi không có lỗi. Để nhanh chóng 3.2/4.0

override func viewDidLoad() { 
    super.viewDidLoad() 

    let layer = CAShapeLayer() 
    layer.anchorPoint = CGPoint.zero 
    layer.path = UIBezierPath.init(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 200)).cgPath 
    layer.bounds = (layer.path?.boundingBox)! // IMPORTANT, without this hitTest wont work 
    layer.fillColor = UIColor.red.cgColor 
    self.view.layer.addSublayer(layer) 

} 
    // Check for touches 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let point = touches.first?.location(in: self.view) // Where you pressed 

    if let layer = self.view.layer.hitTest(point!) as? CAShapeLayer { // If you hit a layer and if its a Shapelayer 
     if (layer.path?.contains(point!))! { // Optional, if you are inside its content path 
      print("Hit shapeLayer") // Do something 
     } 
    } 
} 
Các vấn đề liên quan