วาด 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
คุณควรพิจารณาบทช่วยสอน Core Graphics ให้ละเอียดยิ่งขึ้น เช่นนี้: 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