UIView с CGPath и другим UIView, который содержит первый. Как поместить первый вид во второй?

#ios #uiview #uiviewcontroller #quartz-graphics #cgpath

#iOS #uiview #uiviewcontroller #quartz-графика #cgpath

Вопрос:

проблема в том…

У меня есть путь, и я создаю представление, в котором я его рисую. Вид имеет тот же размер пути. Затем я создаю второй вид, в котором я переопределяю sizeThatFit: метод, поэтому первый вид масштабируется до тех пор, пока все пространство второго вида не будет заполнено (это моя идея о том, что делает sizeThatFit: метод! Я не знаю, правильно ли это). Это код:

  CGRect rect = CGPathGetBoundingBox(objPath);
 CGRect areaPath = CGRectMake(x, y, rect.size.width, rect.size.height);

 FirstView* first = [[FirstView alloc] initWithFrame:areaPath andObjPath:objPath];
 SecondView* second = [[SecondView alloc] initWithFrame:CGRectMake(x, y, 200, 200)];
 [second addSubview:first];
 

Во втором представлении я переопределил sizeThatFit: метод!

Я не знаю, почему это не работает! Путь всегда имеет одинаковое измерение. Я бы взял путь и нарисовал его в представлении, в котором путь принимает его измерение. Так, например, если поле привязки пути равно [10,10], а представление равно [100,100], я бы хотел, чтобы этот путь стал таким же большим, как размер представления. Как я могу сделать??

Я надеюсь, что проблема достаточно ясна. Извините за мой английский 🙂

Это FirstView.m:

 @synthesize objPath;


- (id)initWithFrame:(CGRect)frame andObjPath:(CGMutablePathRef)path {

self = [super initWithFrame:frame];
if (self) {
    // Initialization code.
    objPath = CGPathCreateMutable();
    CGRect rect = CGPathGetBoundingBox(path);       
    CGAffineTransform trans = CGAffineTransformMake(10, 0, 0, 10, self.bounds.size.width, self.bounds.size.height);
    CGPathAddPath(objPath, amp;trans, path);
    CGRect pathContainer = CGPathGetBoundingBox(path);
    CGPathAddRect(objPath, amp;trans, pathContainer);
    CGPathCloseSubpath(objPath);
}
return self;
}

- (void)drawRect:(CGRect)rect {
// Drawing code.
CGContextRef current = UIGraphicsGetCurrentContext();

CGContextAddPath(current, objPath);

CGContextSetLineWidth(current, 0.6);
CGContextSetRGBStrokeColor(current, 0xff / 255.0, 0x40 / 255.0, 0x40 / 255.0, 1);
CGContextSetRGBFillColor(current, 0xff / 255.0, 0xc1 / 255.0, 0xc1 / 255.0, 1);

CGContextDrawPath(current, kCGPathFillStroke);
}
 

Редактировать:

Если я сделаю

  FirstView* first = [[FirstView alloc] initWithFrame:areaPath andObjPath:objPath];
 SecondView* second = [[SecondView alloc] initWithFrame:CGRectMake(x, y, 200, 200)];
 [second addSubview:first];
[first sizeToFit];
 

и в secondView.m я переопределяю метод sizeThatFit, устанавливается первый вид!!! Проблема в том, что path тоже не установлен!!! Он всегда имеет одно и то же измерение: (

ПРАВКА2

Я тоже пробовал так:

 FirstView* first = [[FirstView alloc] initWithFrame:areaPath andObjPath: objPath];
[first setAutoresizingMask:UIViewAutoresizingFlexibleWidth |  UIViewAutoresizingFlexibleHeight];
[first setContentMode:UIViewContentModeScaleAspectFit];

 SecondView* second = [[SecondView alloc] initWithFrame:CGRectMake(x, y, 200, 200)];
second.autoresizesSubviews = YES;
[second setAutoresizingMask:UIViewAutoresizingFlexibleWidth |  UIViewAutoresizingFlexibleHeight];
[second setContentMode:UIViewContentModeCenter];

[second addSubview:first];
 

Но ничего! Это очень напряженно …. :'(

Пожалуйста, мне нужна помощь!

Ответ №1:

Ваш путь имеет определенный размер, поэтому, чтобы масштабировать этот путь вверх или вниз, вам нужно применить преобразование к CGContext, в котором вы рисуете. Например, вы можете определить масштаб, посмотрев на размер вашего представления и сравнив его с размером вашего пути, а затем применив этот масштаб к контексту:

 // get current context

CGRect pathBoundingBox = CGPathGetBoundingBox(objPath);
CGFloat scale = MIN(self.bounds.size.width/pathBoundingBox.size.width,
                    self.bounds.size.height/pathBoundingBox.side.height);

CGContextScaleCTM(current, scale, scale);

// draw path