【问题标题】:How to Scale UIBezierPath to Fit Current View (in Swift)如何缩放 UIBezierPath 以适应当前视图(在 Swift 中)
【发布时间】:2014-10-17 14:22:52
【问题描述】:

我创建了一个使用从 PaintCode 导入的代码绘制咖啡杯的类,并将该类应用于视图。使用@IBDesignable,我可以在我的故事板中看到杯子是在视图内绘制的,但是整体形状太大了。我可以在代码中重新绘制形状,使其适合视图的当前大小,但是没有办法在绘制后缩放形状,以便当我的视图在不同设备上改变大小时,形状可以正确缩放?

我已经查看了CGContextScaleCTM(aRef, <#sx: CGFloat#>, <#sy: CGFloat#>),但我不确定如何将我视图的boundsCGRect 转换为正确的比例因子

我不想全部发完,但我的绘图代码是这样开始的

bezierPath.moveToPoint(CGPointMake(64.8, 52.81))
bezierPath.addCurveToPoint(CGPointMake(58.89, 43.44), controlPoint1: CGPointMake(64.21, 48.28), controlPoint2: CGPointMake(62.11, 44.95))
bezierPath.addCurveToPoint(CGPointMake(56.82, 42.76), controlPoint1: CGPointMake(58.24, 43.13), controlPoint2: CGPointMake(57.55, 42.9))

然后继续

bezierPath.closePath()
bezierPath.miterLimit = 4
bezierPath.usesEvenOddFillRule = true;

还有另外两块绘制代码,用于为咖啡蒸汽绘制两条小线。我将这两个路径附加到原始bezierPath,然后设置填充颜色并填充整个形状。

【问题讨论】:

  • 我会根据您要绘制的尺寸制作绘图代码。缩放可能会导致伪影。
  • @dasdom Add 添加了我用来绘制形状的技术示例。您能否指出我如何根据尺寸制作图纸的正确方向?
  • 将绘制代码放入带frame参数的方法中。使用框架的原点定义位于左上角的点的相对坐标,并使用大小和原点定义右下角的坐标。绘图代码是否在 drawRect: 方法中?

标签: swift scale ios8 uibezierpath


【解决方案1】:

在代码中,您可以使用此UIBezierPath swift 扩展PaintCodeScale 随意缩放路径。

例如

bezierPath.fit(into: rect).moveCenter(to: rect.center).fill()

【讨论】:

  • 这非常适合我的目的。然而,它会导致一个恼人的 xcode 错误,指出该方法未使用。你有没有遇到过这种情况,有解决办法吗?
  • @lifewithelliott 这些函数(例如偏移量)实际上是返回被忽略的值。您可以在每个之前添加 _ = 警告将被静音(例如 _ = offset(to: CGSize(width: vector.dx, height: vector.dy)))。
  • 它是否也可用于 obj c :(( 我非常需要它。@xhamr
【解决方案2】:

由于我使用 PaintCode 来生成我的绘图代码,我找到了一种方法来使用应用程序的帮助来实现 @dasdom 的建议。

在 PaintCode 中有一个“框架”工具,您可以将其放置在绘图周围。这会为您的作品启用约束,以便相对于帧大小重新绘制矢量。框架是一个变量,当您将其带入 Xcode 时,它​​会与您的代码一起导出。当我在 Xcode 中将绘图代码添加到我的类中,然后将该类添加到我在 Storyboard 中的视图中时,Xcode 会自动将框架缩放到视图大小,因此我的类中的绘图代码也会自动调整大小以适合我的视图。现在,艺术品将自动重新绘制,以适应我将课程添加到的任何视图。由于 Storyboard 中为我已应用图形类的视图启用了“自动调整子视图大小”选项,可能会发生自动调整大小。

【讨论】:

    【解决方案3】:
    func scalePath(path: UIBezierPath) -> UIBezierPath {
        
        let w1: CGFloat = path.bounds.size.width
        let h1: CGFloat = path.bounds.size.height
        
        let w2: CGFloat = self.frame.width
        let h2: CGFloat = self.frame.height
        
        var s: CGFloat = 1.0
        
        // take the smaller one and scale 1:1 to fit (to keep the aspect ratio)
        if w2 <= h2 {
            s = w2 / w1
        } else {
            s = h2 / h1
        }
        
        path.apply(CGAffineTransform(scaleX: s, y: s))
        
        return (path)
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多