У меня есть UIView, который я хочу изменить с помощью UISlider. Мой диапазон UISlider установлен в 1.0-2.0. В настоящее время я изменяю размер представления с помощью CGAffineTransform.Изменение размера UIView и динамическое изменение размера чертежа в drawRect
Скриншот:
Мои сделано в пользовательских UIView:
- (void)drawRect:(CGRect)rect {
NSLog(@"Draw rect called");
//// Square Drawing
UIBezierPath* squarePath = [UIBezierPath bezierPathWithRect: CGRectMake(8, 8, 50, 50)];
[UIColor.whiteColor setFill];
[squarePath fill];
//// Right top Drawing
UIBezierPath* rightTopPath = [UIBezierPath bezierPathWithRect: CGRectMake(57, 13, 9, 10)];
[UIColor.whiteColor setStroke];
rightTopPath.lineWidth = 1;
[rightTopPath stroke];
//// Top left Drawing
UIBezierPath* topLeftPath = [UIBezierPath bezierPathWithRect: CGRectMake(13, 0, 17.5, 9)];
[UIColor.whiteColor setStroke];
topLeftPath.lineWidth = 1;
[topLeftPath stroke];
//// Top right Drawing
UIBezierPath* topRightPath = [UIBezierPath bezierPathWithRect: CGRectMake(35, 0, 17.5, 9)];
[UIColor.whiteColor setStroke];
topRightPath.lineWidth = 1;
[topRightPath stroke];
//// Right middle Drawing
UIBezierPath* rightMiddlePath = [UIBezierPath bezierPathWithRect: CGRectMake(57, 28, 9, 10)];
[UIColor.whiteColor setStroke];
rightMiddlePath.lineWidth = 1;
[rightMiddlePath stroke];
//// Right bottom Drawing
UIBezierPath* rightBottomPath = [UIBezierPath bezierPathWithRect: CGRectMake(57, 43, 9, 10)];
[UIColor.whiteColor setStroke];
rightBottomPath.lineWidth = 1;
[rightBottomPath stroke];
}
Код для слайдера:
- (IBAction)changeValue:(id)sender {
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, self.slider.value, self.slider.value);
self.square.transform = transform;
}
Это работает хорошо, однако есть потери качества в рисунок, поскольку я изменяю размер, потому что я фактически не динамически изменяя размер рисунка. То, что я действительно хотел бы сделать, - это изменить размер рисунка динамически. Как я могу это достичь? Нужно ли сначала изменить размер кадра, а затем позвонить [self.square setNeedsDisplay]
, передавая коэффициент умножения?
EDIT:
Так что я устал этот метод, теперь, когда я двигаю ползунок у меня есть:
- (IBAction)changeValue:(id)sender {
CGRect newFrame = CGRectMake(20, 20, 72*self.slider2.value, 72*self.slider2.value);
self.square.frame = newFrame;
[self.square resizeAt:self.slider2.value];
}
Так что я просто изменить размер кадра в настоящее время, а затем передавая значение ползунка в поле зрения и вызов:
-(void)resizeAt: (float)multiply{
self.size=multiply;
self.transform = CGAffineTransformScale(CGAffineTransformIdentity, self.size, self.size);
[self setNeedsDisplay];
}
пример того, что происходит в DrawRect:
UIBezierPath* squarePath = [UIBezierPath bezierPathWithRect: CGRectMake(11, 11, 50, 50)];
[squarePath applyTransform:self.transform];
[UIColor.whiteColor setFill];
[squarePath fill];
Однако изображение не выглядит резким или «перерисованы»
Как бы я масштабировал путь? До того, как я использовал CGAffineTransform. Могу ли я применить этот объект к UIBezierPaths? – Kex
Отредактировал мой вопрос, чтобы показать вам, что я сейчас делаю. – Kex
Да, вы применили бы аналогичное преобразование ко всем путям и затем нарисовали их. Никакое преобразование не будет применено к представлению. – Wain