【问题标题】:How to fit custom UIBezierPath into NSTextContainer如何将自定义 UIBezierPath 放入 NSTextContainer
【发布时间】:2015-04-02 10:50:09
【问题描述】:

我使用的是这个链接中的方法:How to fit text in a circle in UILabel

while (![circle containsPoint:p])

当我使用原始方法时,[UIBezierPath bezierPathWithOvalInRect:r]; 效果很好。但是当我绘制自己的 UIBezierPath 并替换它时,它不起作用。 while 循环永远持续下去。下面是(A)自定义 UIBezierPath 绘制和(B)默认 UIBezierPath 椭圆的截图:http://i.imgur.com/n74BHjX.png

func drawPath() -> UIBezierPath 
{
    var path = UIBezierPath()
    path.moveToPoint(CGPointMake(126,488))
    path.addCurveToPoint(CGPointMake(196,471), controlPoint1: CGPointMake(156,488), controlPoint2: CGPointMake(175,471))
    path.addCurveToPoint(CGPointMake(266,488), controlPoint1: CGPointMake(216,471), controlPoint2: CGPointMake(235,488))
    path.addCurveToPoint(CGPointMake(362,382), controlPoint1: CGPointMake(296,488), controlPoint2: CGPointMake(338,440))
    path.addCurveToPoint(CGPointMake(304,290), controlPoint1: CGPointMake(327,365), controlPoint2: CGPointMake(304,331))
    path.addCurveToPoint(CGPointMake(349,206), controlPoint1: CGPointMake(304,255), controlPoint2: CGPointMake(322,224))
    path.addCurveToPoint(CGPointMake(265,164), controlPoint1: CGPointMake(327,178), controlPoint2: CGPointMake(295,164))
    path.addCurveToPoint(CGPointMake(196,182), controlPoint1: CGPointMake(219,164), controlPoint2: CGPointMake(218,182))
    path.addCurveToPoint(CGPointMake(126,164), controlPoint1: CGPointMake(173,182), controlPoint2: CGPointMake(172,164))
    path.addCurveToPoint(CGPointMake(12,298), controlPoint1: CGPointMake(73,164), controlPoint2: CGPointMake(12,210))
    path.addCurveToPoint(CGPointMake(126,488), controlPoint1: CGPointMake(12,387), controlPoint2: CGPointMake(81,488))

    return path
}

override func lineFragmentRectForProposedRect(proposedRect: CGRect, atIndex characterIndex: Int, writingDirection baseWritingDirection: NSWritingDirection, remainingRect: UnsafeMutablePointer<CGRect>) -> CGRect 
{
    var result = super.lineFragmentRectForProposedRect(proposedRect, atIndex:characterIndex, writingDirection:baseWritingDirection, remainingRect:remainingRect)
    let r = CGRectMake(0,0,self.size.width,self.size.height)
    let circle = drawPath() //UIBezierPath(ovalInRect: r)
    println("this is self created irregular shape: \(path)")
    println("this is the default working OVALLLL: \(UIBezierPath(ovalInRect: r))")

    while !circle.containsPoint(result.origin) {
        result.origin.x += 0.1
        println(result.origin.x)
    }
     while !circle.containsPoint(CGPointMake(result.maxX, result.origin.y)) {
        result.size.width -= 0.1
    }
    return result
}

【问题讨论】:

  • 请显示您用于绘制路径的代码
  • 您的代码中有错误。除非您向我们展示该代码,否则我们应该如何为您提供帮助?
  • 抱歉,已更新! @亚历山大
  • while 循环永远持续下去。我看不到 while 循环。
  • 你去@LordZsolt

标签: ios objective-c swift textkit nstextcontainer


【解决方案1】:

如果我正确理解您的形状,您正尝试水平扫描以检测重叠,但您使用的路径在平面 y=0 上不存在。您需要更改r.originy 值或使用到达y=0 的路径。

【讨论】:

  • 感谢您的及时回复!如果我想更改 r.origin,它应该等于什么?
  • 我认为你是对的。当我 println 时循环。默认的椭圆贝塞尔路径确实在 y = 0 处结束,但我该如何解决 =\
  • 水平扫描直到到达矩形的边界,然后增加y位置并再次开始水平扫描。重复直到成功。
  • 能否请您发布一个示例代码 =P 因为我的大脑现在有点冻结,不知道该怎么办。非常感谢!
  • 嗨@Reeve,我认为您已经掌握了足够的信息来编写代码,因为您知道了解决方案。
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多