Рисование полигонов в Swift

Мне нужно выделить неправильную форму, когда пользователь нажимает на нее. Моя идея о том, как это сделать, заключалась в том, чтобы нарисовать многоугольник, соответствующий форме, заполнить его цветом и изменить непрозрачность, чтобы сделать его полупрозрачным. К сожалению, я не могу найти ничего о том, как это сделать. По сути, я хочу нарисовать заполненный многоугольник, наложить его на свою карту, а затем иметь возможность отклонить (или скрыть) его. Как я могу это сделать?


person Floyd Resler    schedule 07.11.2014    source источник
comment
Посмотрите это приложение для Mac, написанное на Objective C. Вы можете получить от него представление.   -  person Sandeep    schedule 07.11.2014
comment
Вы можете либо нарисовать фигуру в drawRect: (используя UIBezierPath), либо создать представление и добавить путь Безье к CAShapeLayer, который вы добавляете к слою представления.   -  person rdelmar    schedule 07.11.2014


Ответы (1)


Вероятно, вы захотите использовать CAShapeLayer. Вот демо:

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

Результат:

демонстрация

Свифт 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
person rob mayoff    schedule 07.11.2014
comment
спасибо тебе мужик. Это великолепно. Можете ли вы предоставить способ обработки/добавления дополнительных строк в путь с помощью функции перетаскивания - person famfamfam; 16.08.2018
comment
как мы можем использовать жест панорамирования для перемещения всей формы или одной угловой точки в определенную точку? - person adijazz91; 21.08.2020