2015-10-18 3 views
1

У меня есть UIView, который я хочу изменить с помощью UISlider. Мой диапазон UISlider установлен в 1.0-2.0. В настоящее время я изменяю размер представления с помощью CGAffineTransform.Изменение размера UIView и динамическое изменение размера чертежа в drawRect

Скриншот:

enter image description here

Мои сделано в пользовательских 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]; 

Однако изображение не выглядит резким или «перерисованы»

ответ

1

Создав свои Безье пути с точками в диапазоне от 0,0 до 1,0, а затем прикладывая ваш преобразование непосредственно к каждому пути Безье. Масштаб вашего преобразования, очевидно, изменится, потому что вы масштабируете пути до полного размера представления, а не относительный размер.

Поскольку вы масштабируете путь, а не уже визуализированный вид, рендеринг пути по-прежнему будет чистым и точным.

+0

Как бы я масштабировал путь? До того, как я использовал CGAffineTransform. Могу ли я применить этот объект к UIBezierPaths? – Kex

+0

Отредактировал мой вопрос, чтобы показать вам, что я сейчас делаю. – Kex

+0

Да, вы применили бы аналогичное преобразование ко всем путям и затем нарисовали их. Никакое преобразование не будет применено к представлению. – Wain