Измените размер UIView, чтобы соответствовать CGPath - PullRequest
4 голосов
/ 15 марта 2011

У меня есть подкласс UIView, в который пользователь может добавить случайный CGPath.CGPath добавляется обработкой UIPanGestures.

Я хотел бы изменить размер UIView до минимально возможного прямоугольника, который содержит CGPath.В моем подклассе UIView я переопределил sizeThatFits для возврата минимального размера как такового:

- (CGSize) sizeThatFits:(CGSize)size {
    CGRect box = CGPathGetBoundingBox(sigPath);
    return box.size;
}

Это работает, как и ожидалось, и размер UIView изменяется до возвращаемого значения, но CGPath также "пропорционально изменяется", в результате чегопо другому пути, что то, что пользователь изначально нарисовал.Например, это представление с путем, нарисованным пользователем:

Path as drawn

И это представление с путем после изменения размера:

enter image description here

Как я могу изменить размер своего UIView, а не "изменить размер" пути?

1 Ответ

6 голосов
/ 27 августа 2011

Используйте CGPathGetBoundingBox.Из документации Apple:

Возвращает ограничивающий прямоугольник, содержащий все точки в графическом контуре.Ограничительная рамка - это наименьший прямоугольник, полностью охватывающий все точки на пути, включая контрольные точки для кривых Безье и квадратичных кривых.

Здесь представлены небольшие методы drawRect для проверки концепции.Надеюсь, это поможет вам!

- (void)drawRect:(CGRect)rect {

    //Get the CGContext from this view
    CGContextRef context = UIGraphicsGetCurrentContext();

    //Clear context rect
    CGContextClearRect(context, rect);

    //Set the stroke (pen) color
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    //Set the width of the pen mark
    CGContextSetLineWidth(context, 1.0);

    CGPoint startPoint = CGPointMake(50, 50);
    CGPoint arrowPoint = CGPointMake(60, 110);

    //Start at this point
    CGContextMoveToPoint(context, startPoint.x, startPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+100, startPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+100, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x+50, startPoint.y+90);
    CGContextAddLineToPoint(context, arrowPoint.x, arrowPoint.y);
    CGContextAddLineToPoint(context, startPoint.x+40, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x, startPoint.y+90);
    CGContextAddLineToPoint(context, startPoint.x, startPoint.y);

    //Draw it
    //CGContextStrokePath(context);

    CGPathRef aPathRef = CGContextCopyPath(context);

    // Close the path
    CGContextClosePath(context);

    CGRect boundingBox = CGPathGetBoundingBox(aPathRef);
    NSLog(@"your minimal enclosing rect: %.2f %.2f %.2f %.2f", boundingBox.origin.x, boundingBox.origin.y, boundingBox.size.width, boundingBox.size.height);
} 
...