как нарисовать стрелку в моем представлении?

Привет и заранее спасибо за любые ответы. Я хочу нарисовать большую широкую стрелку на моем UIView, имеющую оттенок от светло-зеленого до темно-зеленого. Я просматривал документацию для CGContextRef, CGPathRef и UIBezierPath, но все больше запутался. Может ли кто-нибудь помочь мне с этим. Спасибо!


person serge2487    schedule 25.04.2011    source источник
comment
Кажется, не так много (какого-либо?) примера кода, характерного для UIBezierPath, но вы можете посмотреть пример кода для NSBezierPath, эквивалента Cocoa, для начала.   -  person jscs    schedule 26.04.2011
comment
Я должен был добавить: это не будет совсем то же самое, но я думаю, сходства будет достаточно для точки входа.   -  person jscs    schedule 26.04.2011
comment
Я понимаю. Я немного изучил его, но, похоже, я правильно его объявил, потому что он не распознает NSBezierPath при сборке. Я буду продолжать попытки, спасибо!   -  person serge2487    schedule 26.04.2011
comment
NSBezierPath недоступно на iOS; UIBezierPath — это версия Cocoa-Touch. Они очень похожи; многие методы одинаковы. Для NSBezierPath доступно множество примеров кода и учебных материалов, так что вы можете создать тестовое приложение Cocoa (Mac OS X), поэкспериментировать с NSBezierPath, а затем перенести свои новые знания на использование UIBezierPath на iOS.   -  person jscs    schedule 26.04.2011


Ответы (1)


Вопрос старый, но я рад поделиться с вами некоторым кодом, который, я надеюсь, будет полезен - совместимость со Swift 2.3 -

public extension UIView {

  public enum PeakSide: Int {
        case Top
        case Left
        case Right
        case Bottom
    }

    public func addPikeOnView(side side: PeakSide, size: CGFloat = 10.0) {
        self.layoutIfNeeded()
        let peakLayer = CAShapeLayer()
        var path: CGPathRef?
        switch side {
        case .Top:
            path = self.makePeakPathWithRect(self.bounds, topSize: size, rightSize: 0.0, bottomSize: 0.0, leftSize: 0.0)
        case .Left:
            path = self.makePeakPathWithRect(self.bounds, topSize: 0.0, rightSize: 0.0, bottomSize: 0.0, leftSize: size)
        case .Right:
            path = self.makePeakPathWithRect(self.bounds, topSize: 0.0, rightSize: size, bottomSize: 0.0, leftSize: 0.0)
        case .Bottom:
            path = self.makePeakPathWithRect(self.bounds, topSize: 0.0, rightSize: 0.0, bottomSize: size, leftSize: 0.0)
        }
        peakLayer.path = path
        let color = (self.backgroundColor ?? .clearColor()).CGColor
        peakLayer.fillColor = color
        peakLayer.strokeColor = color
        peakLayer.lineWidth = 1
        peakLayer.position = CGPoint.zero
        self.layer.insertSublayer(peakLayer, atIndex: 0)
    }


    func makePeakPathWithRect(rect: CGRect, topSize ts: CGFloat, rightSize rs: CGFloat, bottomSize bs: CGFloat, leftSize ls: CGFloat) -> CGPathRef {
        //                      P3
        //                    /    \
        //      P1 -------- P2     P4 -------- P5
        //      |                               |
        //      |                               |
        //      P16                            P6
        //     /                                 \
        //  P15                                   P7
        //     \                                 /
        //      P14                            P8
        //      |                               |
        //      |                               |
        //      P13 ------ P12    P10 -------- P9
        //                    \   /
        //                     P11

        let centerX = rect.width / 2
        let centerY = rect.height / 2
        var h: CGFloat = 0
        let path = CGPathCreateMutable()
        var points: [CGPoint] = []
        // P1
        points.append(CGPointMake(rect.origin.x, rect.origin.y))
        // Points for top side
        if ts > 0 {
            h = ts * sqrt(3.0) / 2
            let x = rect.origin.x + centerX
            let y = rect.origin.y
            points.append(CGPointMake(x - ts, y))
            points.append(CGPointMake(x, y - h))
            points.append(CGPointMake(x + ts, y))
        }

        // P5
        points.append(CGPointMake(rect.origin.x + rect.width, rect.origin.y))
        // Points for right side
        if rs > 0 {
            h = rs * sqrt(3.0) / 2
            let x = rect.origin.x + rect.width
            let y = rect.origin.y + centerY
            points.append(CGPointMake(x, y - rs))
            points.append(CGPointMake(x + h, y))
            points.append(CGPointMake(x, y + rs))
        }

        // P9
        points.append(CGPointMake(rect.origin.x + rect.width, rect.origin.y + rect.height))
        // Point for bottom side
        if bs > 0 {
            h = bs * sqrt(3.0) / 2
            let x = rect.origin.x + centerX
            let y = rect.origin.y + rect.height
            points.append(CGPointMake(x + bs, y))
            points.append(CGPointMake(x, y + h))
            points.append(CGPointMake(x - bs, y))
        }

        // P13
        points.append(CGPointMake(rect.origin.x, rect.origin.y + rect.height))
        // Point for left side
        if ls > 0 {
            h = ls * sqrt(3.0) / 2
            let x = rect.origin.x
            let y = rect.origin.y + centerY
            points.append(CGPointMake(x, y + ls))
            points.append(CGPointMake(x - h, y))
            points.append(CGPointMake(x, y - ls))
        }

        let startPoint = points.removeFirst()
        self.startPath(path: path, onPoint: startPoint)
        for point in points {
            self.addPoint(point, toPath: path)
        }
        self.addPoint(startPoint, toPath: path)
        return path
    }

    private func startPath(path path: CGMutablePath, onPoint point: CGPoint) {
        CGPathMoveToPoint(path, nil, point.x, point.y)
    }

    private func addPoint(point: CGPoint, toPath path: CGMutablePath) {
        CGPathAddLineToPoint(path, nil, point.x, point.y)
    }

}

Таким образом, вы можете вызвать это для любого вида:

let view = UIView(frame: frame)
view.addPikeOnView(side: .Top)

В будущем добавлю смещение для позиции щуки.

  • да, имена определенно улучшаются!
person Luca Davanzo    schedule 28.10.2016