UIView с CGPath и другой UIView, который содержит первый.Как вписать первый вид во второй? - PullRequest
0 голосов
/ 22 октября 2011

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

У меня есть путь, и я создаю вид, в котором я рисую его.Вид имеет одинаковое измерение пути.Затем я создаю второе представление, в котором переопределяю 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];

В SecondView я переопределил sizeThatFit: метод!

Я не знаю, почему это не работает!Путь всегда имеет одно и то же измерение.Я выбрал бы путь и нарисовал бы его в виде, в котором путь принимает его измерение.Так, например, если boundingBox для пути равен [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, &trans, path);
    CGRect pathContainer = CGPathGetBoundingBox(path);
    CGPathAddRect(objPath, &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.mi sizeThatFit устанавливается первое представление !!!Проблема в том, что путь тоже не подходит !!!У него всегда одно и то же измерение: (

EDIT2

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

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 Ответ

1 голос
/ 12 января 2012

Ваш путь имеет определенный размер, поэтому для масштабирования этого пути вверх или вниз вам нужно применить преобразование к 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
...