Нарисуйте UIView на основе CGPoint на экране

У меня есть четыре маленьких круга на экране в случайном месте. Эти маленькие круги могут быть где угодно на экране и перед MapView.

введите здесь описание изображения

Как я могу создать фигуру на основе этих кругов?

введите здесь описание изображения

Кроме того, пользователь может нажать кнопку, чтобы случайным образом изменить положение кругов, поэтому форма должна быть воссоздана.

введите здесь описание изображения

Пока что я читаю о UIBezierPath и могу создать фигуру на основе точек, но не могу делать это динамически.

UIBezierPath* bezierPath = [UIBezierPath bezierPath];
[bezierPath moveToPoint: CGPointMake(52, 33)];
[bezierPath addLineToPoint: CGPointMake(145, 19)];
[bezierPath addLineToPoint: CGPointMake(158, 79)];
[bezierPath addLineToPoint: CGPointMake(66, 103)];
[UIColor.grayColor setFill];
[bezierPath fill];

person isaiasmac    schedule 13.02.2016    source источник
comment
Вам следует внимательно изучить учебные пособия по базовой графике, такие как этот: raywenderlich.com/32283/ Объект CGContextRef поможет вам достичь желаемого   -  person Randy    schedule 14.02.2016
comment
Спасибо, Рэнди, за ответ. Я прочитал учебник, но все еще не могу этого сделать.   -  person isaiasmac    schedule 17.02.2016


Ответы (1)


Что вы можете сделать, так это добавить UIImageView с прозрачным цветом фона в качестве подвида вашего MapView (представление изображения должно иметь ту же рамку, что и представление карты).

В viewDidLoad вы можете начать imageContext, используя:

UIGraphicsBeginImageContext(self.imageView.frame.size)

Затем вы можете рисовать линии между вашими точками, используя CGMutablePath :

func drawLines()
    {
        let point1 = CGPointMake(20, 100)
        let point2 = CGPointMake(230, 150)
        let point3 = CGPointMake(40, 340)

        let points = [point1, point2, point3]

        let context = UIGraphicsGetCurrentContext()
        CGContextClearRect(context, self.imageView.frame)

        let pathRef = CGPathCreateMutable();

        for var i = 0; i < points.count; i++
        {
            let point = points[i]

            if i == 0
            {
                CGPathMoveToPoint(pathRef, nil, point.x, point.y)
            }
            else
            {
                CGPathAddLineToPoint(pathRef, nil, point.x, point.y)
            }
        }

        CGContextSetLineWidth(context, 5.0)
        CGPathCloseSubpath(pathRef)
        CGContextAddPath(context, pathRef);
        CGContextSetStrokeColorWithColor(context, UIColor.brownColor().CGColor)
        CGContextStrokePath(context)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        self.imageView.image = image
    }

Конечно, вы должны адаптировать этот метод к своим потребностям, но это будет работать динамически.

Это не единственное решение. Если вы хотите узнать Core Graphics немного больше, вам следует прочитать некоторую документацию. Это может быть довольно мощно.

person Randy    schedule 14.02.2016