How to draw a “speech bubble” on an iPhone?

后端 未结 11 1189
礼貌的吻别
礼貌的吻别 2020-11-29 16:34

I\'m trying to get a \"speech bubble\" effect similar to the one in Mac OS X when you right click on something in the dock. Here\'s what I have now:

11条回答
  •  我在风中等你
    2020-11-29 17:27

    Swift 4 Update

    Here's a Swift 4 version of AVT's original code.

     private func bubblePathForContentSize(contentSize: CGSize) -> UIBezierPath {
        let rect = CGRect(origin: .zero, size: CGSize(width: contentSize.width, height: contentSize.height)).offsetBy(dx: radius, dy: radius + triangleHeight)
        let path = UIBezierPath();
        let radius2 = radius - borderWidth / 2 // Radius adjasted for the border width
    
        path.move(to: CGPoint(x: rect.maxX - triangleHeight * 2, y: rect.minY - radius2))
        path.addLine(to: CGPoint(x: rect.maxX - triangleHeight, y: rect.minY - radius2 - triangleHeight))
        path.addArc(withCenter: CGPoint(x: rect.maxX, y: rect.minY),
                    radius: radius2,
                    startAngle: CGFloat(-(Double.pi/2)), endAngle: 0, clockwise: true)
        path.addArc(withCenter: CGPoint(x: rect.maxX, y: rect.maxY),
                    radius: radius2,
                    startAngle: 0, endAngle: CGFloat(Double.pi/2), clockwise: true)
        path.addArc(withCenter: CGPoint(x: rect.minX, y: rect.maxY),
                    radius: radius2,
                    startAngle: CGFloat(Double.pi/2),endAngle: CGFloat(Double.pi), clockwise: true)
        path.addArc(withCenter: CGPoint(x: rect.minX, y: rect.minY),
                    radius: radius2,
                    startAngle: CGFloat(Double.pi), endAngle: CGFloat(-(Double.pi/2)), clockwise: true)
        path.close()
        return path
    }
    
    //Example usage:
     let bubbleLayer = CAShapeLayer()
     bubbleLayer.path = bubblePathForContentSize(contentView.bounds.size).CGPath
     bubbleLayer.fillColor = fillColor.CGColor
     bubbleLayer.strokeColor = borderColor.CGColor
     bubbleLayer.lineWidth = borderWidth
     bubbleLayer.position = CGPoint.zero
     myView.layer.addSublayer(bubbleLayer)
    

提交回复
热议问题