Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将自定义UIBezierPath装入NSTextContainer_Ios_Objective C_Swift_Textkit_Nstextcontainer - Fatal编程技术网

Ios 如何将自定义UIBezierPath装入NSTextContainer

Ios 如何将自定义UIBezierPath装入NSTextContainer,ios,objective-c,swift,textkit,nstextcontainer,Ios,Objective C,Swift,Textkit,Nstextcontainer,我正在使用此链接中的方法: 当我使用原始方法时,[UIBezierPath-bezierpath-withovalinrect:r]它工作得很好。但当我画出自己的UIBezierPath并替换它时,它就不起作用了。while循环将永远持续下去。以下是(A)自定义UIBezierPath图形和(B)默认UIBezierPath椭圆的屏幕截图: func drawPath()->UIBezierPath { var path=UIBezierPath() path.moveToPoint(CGPoi

我正在使用此链接中的方法:


当我使用原始方法时,
[UIBezierPath-bezierpath-withovalinrect:r]它工作得很好。但当我画出自己的UIBezierPath并替换它时,它就不起作用了。while循环将永远持续下去。以下是(A)自定义UIBezierPath图形和(B)默认UIBezierPath椭圆的屏幕截图:

func drawPath()->UIBezierPath
{
var path=UIBezierPath()
path.moveToPoint(CGPointMake(126488))
addCurveToPoint(CGPointMake(196471)、controlPoint1:CGPointMake(156488)、controlPoint2:CGPointMake(175471))
addCurveToPoint(CGPointMake(266488)、controlPoint1:CGPointMake(216471)、controlPoint2:CGPointMake(235488))
addCurveToPoint(CGPointMake(362382)、controlPoint1:CGPointMake(296488)、controlPoint2:CGPointMake(338440))
addCurveToPoint(CGPointMake(304290)、controlPoint1:CGPointMake(327365)、controlPoint2:CGPointMake(304331))
addCurveToPoint(CGPointMake(349206)、controlPoint1:CGPointMake(304255)、controlPoint2:CGPointMake(322224))
addCurveToPoint(CGPointMake(265164)、controlPoint1:CGPointMake(327178)、controlPoint2:CGPointMake(295164))
addCurveToPoint(CGPointMake(196182),controlPoint1:CGPointMake(219164),controlPoint2:CGPointMake(218182))
addCurveToPoint(CGPointMake(126164),controlPoint1:CGPointMake(173182),controlPoint2:CGPointMake(172164))
addCurveToPoint(CGPointMake(12298),controlPoint1:CGPointMake(73164),controlPoint2:CGPointMake(12210))
addCurveToPoint(CGPointMake(126488)、controlPoint1:CGPointMake(12387)、controlPoint2:CGPointMake(81488))
返回路径
}
重写func lineFragmentRectForProposedRect(proposedRect:CGRect,atIndex characterIndex:Int,writingDirection baseWritingDirection:NSWritingDirection,remainingRect:UnsafeMutablePointer)->CGRect
{
var结果=super.lineFragmentRectForProposedRect(proposedRect,atIndex:characterIndex,writingDirection:baseWritingDirection,remainingRect:remainingRect)
设r=CGRectMake(0,0,self.size.width,self.size.height)
让circle=drawPath()//UIBezierPath(ovalInRect:r)
println(“这是自行创建的不规则形状:\(路径)”)
println(“这是默认的工作椭圆ll:\(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)){
结果.size.width-=0.1
}
返回结果
}

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

请显示用于绘制路径的代码您的代码中存在错误。除非你把代码给我们看,否则我们怎么能帮助你呢?对不起,更新了@Alexanderwhile循环将永远持续下去。我看不到while循环。你看@lordzsolt谢谢你的及时回复!如果我想改变r原点,它应该等于什么?我想你是对的。当我打印的时候。默认的椭圆bezierpath确实在y=0处结束,但如何解决该问题=\n水平扫描,直到到达矩形的边界,然后增加y位置并再次开始水平扫描。重复,直到你被击中。你可以发布一个示例代码=P,因为我的大脑现在有点僵住了,不知道该怎么办。谢谢!嗨@Reeve,我想你已经有足够的信息来编写代码了,现在你知道了解决方案。
while (![circle containsPoint:p])
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
}