Как вписать пользовательский UIBezierPath в NSTextContainer

Я использую метод по этой ссылке: Как подогнать текст по кругу в UILabel

while (![circle containsPoint:p])

Когда я использую оригинальный метод, [UIBezierPath bezierPathWithOvalInRect:r]; он работает хорошо. Но когда я рисую свой собственный UIBezierPath и подставляю его, он не работает. Цикл while продолжается вечно. Ниже приведен скриншот (A) пользовательского рисунка UIBezierPath и (B) овала UIBezierPath по умолчанию: https://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
}

person Reeve    schedule 02.04.2015    source источник
comment
Пожалуйста, покажите код, который вы используете для рисования пути   -  person Alex    schedule 02.04.2015
comment
У вас ошибка в коде. Как мы должны быть в состоянии помочь вам, если вы не покажете нам этот код?   -  person Duncan C    schedule 02.04.2015
comment
Извините, обновлено! @Александр   -  person Reeve    schedule 02.04.2015
comment
Цикл while продолжается вечно. Я не вижу цикла while.   -  person Lord Zsolt    schedule 02.04.2015
comment
Вот так @LordZsolt   -  person Reeve    schedule 02.04.2015


Ответы (1)


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

person Alex    schedule 02.04.2015
comment
Спасибо за быстрый ответ! Если я хочу изменить r.origin, чему он должен быть равен? - person Reeve; 02.04.2015
comment
Я думаю ты прав. Когда я печатаю цикл while. Овальный путь Безье по умолчанию заканчивается на y = 0, но как мне это решить =\ - person Reeve; 02.04.2015
comment
Сканируйте по горизонтали, пока не достигнете границ прямоугольника, затем увеличьте положение по оси Y и снова начните сканирование по горизонтали. Повторяйте, пока не получите удар. - person Alex; 02.04.2015
comment
Не могли бы вы опубликовать пример кода = P Поскольку мой мозг сейчас замерзает и не знает, что делать. Большое спасибо! - person Reeve; 02.04.2015
comment
Привет @Reeve, я думаю, у тебя достаточно информации, чтобы написать код, теперь, когда ты знаешь решение. - person Alex; 03.04.2015