2015-04-02 2 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

+0

У вас есть ошибка в коде. Как мы должны быть в состоянии помочь вам, если вы не покажете нам этот код? –

+0

Извините, обновлено! @Alexander – Reeve

ответ

1

Если я правильно понимаю вашу форму правильно, вы пытаетесь сканировать горизонтально для обнаружения совпадения, но путь вы использования на плоскости y = 0 не существует. Вам необходимо изменить значение yr.origin или использовать путь, который достигает y = 0.

+0

Спасибо за быстрый ответ! Если бы я хотел изменить r.origin, то в чем он должен быть равен? – Reeve

+0

Я думаю, что ты прав. Когда я распечатываю whileloop. По умолчанию овальная строка безье заканчивается с y = 0, но как я могу решить это = \ – Reeve

+0

Сканировать по горизонтали, пока вы не достигнете границ прямоугольника, а затем увеличьте положение y и начните сканирование по горизонтали снова. Повторяйте, пока не получите удар. – Alex

Смежные вопросы