2014-11-07 30 views
9

Muszę podkreślić nieregularny kształt, gdy użytkownik dotknie go. Moim pomysłem, jak to zrobić, było narysowanie wielokąta, który pasuje do kształtu, wypełnienie go kolorem i zmiana krycia w celu uczynienia go półprzezroczystym. Niestety nie mogę znaleźć niczego, jak to zrobić. Zasadniczo chcę narysować wypełniony wielokąt, nałożyć go na moją mapę, a następnie móc go odrzucić (lub ukryć). Jak mogę to zrobić?Rysowanie wielokątów w Swift

+0

Zobacz tę aplikację mac napisane w Objective C. Można zorientować się od niego. – Sandeep

+0

Możesz albo narysować kształt w drawRect: (przy użyciu UIBezierPath), albo utworzyć widok i dodać ścieżkę beziera do obiektu CAShapeLayer dodawanego do warstwy widoku. – rdelmar

Odpowiedz

27

Prawdopodobnie chcesz użyć CAShapeLayer. Oto demo:

import XCPlayground 
import UIKit 
import CoreText 

let view = UIView(frame: CGRectMake(0, 0, 300, 300)) 
XCPShowView("view", view) 

let imageView = UIImageView(image: UIImage(named: "profile.jpg")) 
imageView.frame = view.bounds 
imageView.contentMode = UIViewContentMode.ScaleAspectFill 
view.addSubview(imageView) 

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(120, 20)) 
path.addLineToPoint(CGPointMake(230, 90)) 
path.addLineToPoint(CGPointMake(240, 250)) 
path.addLineToPoint(CGPointMake(40, 280)) 
path.addLineToPoint(CGPointMake(100, 150)) 
path.closePath() 
shape.path = path.CGPath 

Wynik:

demo

Swift 3:

let shape = CAShapeLayer() 
cell.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.move(to: CGPoint(x: 120, y: 20)) 
path.addLine(to: CGPoint(x: 230, y: 90)) 
path.addLine(to: CGPoint(x: 240, y: 250)) 
path.addLine(to: CGPoint(x: 100, y: 150)) 
path.close() 
shape.path = path.cgPath 
+0

Idealny! Dokładnie to, czego szukałem! Dzięki! –