#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