如何解决UIBezierPath / Shape 有奇怪的定位和大小调整行为
我正在尝试将一些 SVG 数据(一些中文字符的形状)转换为 UIBezierPath。每个字符由多个 UIBezierPath 组成。这是一个 UIBezierPath 的示例:
var mypath: UIBezierPath {
let bp = UIBezierPath()
bp.move(to: CGPoint(x: 147,y: 32))
bp.addQuadCurve(to: CGPoint(x: 203,y: 102),controlPoint: CGPoint(x: 181,y: 74))
bp.addQuadCurve(to: CGPoint(x: 271,y: 189),controlPoint: CGPoint(x: 242,y: 166))
bp.addQuadCurve(to: CGPoint(x: 274,y: 217),controlPoint: CGPoint(x: 287,y: 204))
bp.addQuadCurve(to: CGPoint(x: 229,y: 235),controlPoint: CGPoint(x: 258,y: 229))
bp.addQuadCurve(to: CGPoint(x: 193,controlPoint: CGPoint(x: 204,y: 241))
bp.addQuadCurve(to: CGPoint(x: 190,y: 219),controlPoint: CGPoint(x: 183,y: 231))
bp.addQuadCurve(to: CGPoint(x: 143,y: 71),controlPoint: CGPoint(x: 199,y: 195))
bp.addQuadCurve(to: CGPoint(x: 125,y: 33),controlPoint: CGPoint(x: 134,y: 55))
bp.addCurve(to: CGPoint(x: 147,y: 32),controlPoint1: CGPoint(x: 113,y: 5),controlPoint2: CGPoint(x: 128,y: 9))
bp.close()
return bp
}
由于我的最终结果由多个 UIBezierPaths 组成,因此我正在尝试缩放它们:
extension UIBezierPath {
static func calculateBounds(paths: [UIBezierPath]) -> CGRect {
let myPaths = UIBezierPath()
for path in paths {
myPaths.append(path)
}
return (myPaths.bounds)
}
}
struct ShapeView: Shape {
let bezier: UIBezierPath
let pathBounds: CGRect
func path(in rect: CGRect) -> Path {
let pointScale = (rect.width >= rect.height) ?
max(pathBounds.height,pathBounds.width) :
min(pathBounds.height,pathBounds.width)
let pointTransform = CGAffineTransform(scaleX: 1/pointScale,y: 1/pointScale)
let path = Path(bezier.cgPath).applying(pointTransform)
let multiplier = min(rect.width,rect.height)
let transform = CGAffineTransform(scaleX: multiplier,y: multiplier)
return path.applying(transform)
}
}
查看:
struct Drawer: View {
let pathBounds = UIBezierPath.calculateBounds(paths: [mypath]) // to simplify I just add only one shape. Usually there are multiple
var body: some View {
ZStack{
ShapeView(bezier: mypath,pathBounds: pathBounds)
.background(Color.red)
}
}
}
这是显示的结果:
如您所见:形状未居中且比屏幕大。我做错了什么,我如何才能使形状居中并完美地适合整个屏幕?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。