2015-04-02 55 views
-1

我使用的方法在此鏈接:How to fit text in a circle in UILabel如何適應定製UIBezierPath到NSTextContainer

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 
} 
+0

請顯示您用於繪製路徑的代碼 – Alex 2015-04-02 10:52:36

+0

您的代碼中存在一個錯誤。除非您向我們展示該代碼,否則我們應該如何幫助您? – 2015-04-02 10:55:09

+0

對不起,更新! @Alexander – Reeve 2015-04-02 11:54:37

回答

1

如果我理解你的形狀正確,你想水平掃描檢測重疊,但你的路徑使用在平面y = 0上不存在。您需要更改y的值r.origin或使用達到y = 0的路徑。

+0

感謝您的及時回覆!如果我想改變r.origin,它應該等於什麼? – Reeve 2015-04-02 13:30:14

+0

我認爲你是對的。當我在while循環中打印時。默認的橢圓形貝塞爾路徑在y = 0處結束,但我該如何解決= \ – Reeve 2015-04-02 13:40:11

+0

水平掃描,直到達到矩形邊界,然後增加y位置並再次水平掃描。重複,直到你受到打擊。 – Alex 2015-04-02 13:51:04