2015-09-18 2 views
0

Я использую ACEDrawingView для рисования в виде.iOS: Обрезка вокруг рисованной дорожки?

enter image description here

Как я могу определить ширину и высоту рисунка, так что я могу обрезать вокруг него, что-то вроде этого:

enter image description here

Update: После @Duncan указал я в правильном направлении, я смог ознакомиться с исходным кодом и нашел следующее:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    // save all the touches in the path 
    UITouch *touch = [touches anyObject]; 

    previousPoint2 = previousPoint1; 
    previousPoint1 = [touch previousLocationInView:self]; 
    currentPoint = [touch locationInView:self]; 

    if ([self.currentTool isKindOfClass:[ACEDrawingPenTool class]]) { 
     CGRect bounds = [(ACEDrawingPenTool*)self.currentTool addPathPreviousPreviousPoint:previousPoint2 withPreviousPoint:previousPoint1 withCurrentPoint:currentPoint]; 

     CGRect drawBox = bounds; 
     drawBox.origin.x -= self.lineWidth * 2.0; 
     drawBox.origin.y -= self.lineWidth * 2.0; 
     drawBox.size.width += self.lineWidth * 4.0; 
     drawBox.size.height += self.lineWidth * 4.0; 
     self.drawingBounds = bounds; // I added this property to allow me to extract the bounds and use it in my view controller 

     [self setNeedsDisplayInRect:drawBox]; 
    } 
    else if ([self.currentTool isKindOfClass:[ACEDrawingTextTool class]]) { 
     [self resizeTextViewFrame: currentPoint]; 
    } 
    else { 
     [self.currentTool moveFromPoint:previousPoint1 toPoint:currentPoint]; 
     [self setNeedsDisplay]; 
    } 

} 

Однако я получаю это когда я проверить границы:

enter image description here

Я буду продолжать пытаться понять это, но если кто-то может помочь, что было бы здорово!

Обновление 3: Использование CGContextGetPathBoundingBox Я, наконец, смог его достичь.

enter image description here

ответ

1

Каждый раз, когда вы получаете touchesMoved, запишите местоположение точки, в которой вы сейчас находитесь. Когда все закончится, у вас есть все пункты. Теперь рассмотрим наибольшее значение x и наименьшее значение x и наибольшее значение y и наименьшее значение y во всех этих точках. Это ограничивающая рамка чертежа.

Другой подход (который вы уже обнаружили) - это сохранить CGPath, а затем вызвать CGContextGetPathBoundingBox. В принципе, это то же самое.

enter image description here

Обратите внимание, что путь не имеет толщины, в то время как ваш ход делает. Для этого вам нужно вставить ограничительную рамку, чтобы это сделать (мой screencast этого не делает).

+0

Спасибо Мэтту! Я действительно нашел переменную экземпляра 'CGMutablePathRef path 'и использовал' return CGPathGetBoundingBox (путь): 'Я смог его получить! – KingPolygon

+0

К сожалению, мой подход, кажется, только последний путь. Поэтому, если я рисую несколько строк (рисовать, поднимать палец и рисовать), он смотрит только на новый путь. Я дам ваш подход. – KingPolygon

+0

О, просто держите все пути и создайте сложный путь и получите ограничительную рамку. Мой ответ не нужен. Твой путь лучше. – matt

1

Я не знаком с классом AceDrawingView. Я могу рассказать вам, как это сделать с фреймворками iOS:

Создайте свой путь как UIBezierPath.

Опросить свойство границ пути.

+0

Спасибо, что направили меня в правильном направлении Дункан. Я просматриваю исходный код ACEDrawingView, и я думаю, что я сближаюсь. Я уточню свой ответ. – KingPolygon

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