2014-08-15 1 views
0

У меня есть вид коллекции, размер ячейки которого пользователь может изменить. В представлении коллекции есть ячейка шаблона, которая содержит UIImageView в нижнем правом углу. Этот вид изображения масштабируется пропорционально ячейке просмотра коллекции. В этом представлении изображения я делаю несколько пользовательских чертежей в разное время, используя UIBezierPath объектов.Кривая UIBezier становится размытой при изменении размера

Если я рисую изображение, и пользователь меняет размер ячейки, изображение пропорционально масштабируется и интерполируется, становясь слегка размытым. Это похоже на то, что изображение кэшируется и повторно используется, но это не то, что я хочу. Я хочу, чтобы каждая ячейка должна была перерисовывать свои кривые в своем представлении изображения, чтобы они были острыми и не размытыми.

Вот пример того, как я рисую в UIImageView:

//ImageView.m 
//Draw a custom image (forgive the magic numbers) 
-(void)drawImage{ 
    UIGraphicsBeginImageContext(self.bounds.size); 
    UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(1, 1, self.bounds.size.width-2, self.bounds.size.height-2)]; 
    [[UIColor whiteColor] setStroke]; 
    [circle setLineWidth:self.bounds.size.width/44.0f]; 
    [[UIColor redColor] setFill]; 
    [circle fill]; 
    [circle stroke]; 

    UIBezierPath *checkmark = [UIBezierPath bezierPath]; 
    float r = self.bounds.size.width/160.0f; 
    [checkmark moveToPoint:CGPointMake(40.0f*r, 40.0f*r)]; 
    [checkmark addLineToPoint:CGPointMake(120.0f*r,120.0f*r)]; 
    [checkmark moveToPoint:CGPointMake(40.0f*r, 120.0f*r)]; 
    [checkmark addLineToPoint:CGPointMake(120.0f*r, 40.0f*r)]; 
    [checkmark setLineWidth:self.bounds.size.width/22.0f]; 
    [checkmark stroke]; 
    [self setImage:UIGraphicsGetImageFromCurrentImageContext()]; 
    UIGraphicsEndImageContext(); 
} 

Вот как изменить размер ячейки:

//ViewController.m 
//The user chooses a cell size from a UISegmentedControl. 
-(IBAction)selectedSegmentIndexChanged:(UISegmentedControl *)sender{ 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    int i = sender.selectedSegmentIndex; 
    int p = 2.0f*(4-i); 
    int s = (320-p*i)/(i+1); 
    layout.itemSize = CGSizeMake(s,s); 
    layout.minimumInteritemSpacing = p; 
    layout.minimumLineSpacing = p; 
    [self.collectionView setCollectionViewLayout:layout animated:YES]; 
} 

ответ

0

Я кончался с помощью уведомлений, чтобы достичь своей цели перерисовки изображение.

Когда раскладка делается анимировать я отправляю уведомление:

//ViewController.m 
//The user chooses a cell size from a UISegmentedControl. 
-(IBAction)selectedSegmentIndexChanged:(UISegmentedControl *)sender{ 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    int i = sender.selectedSegmentIndex; 
    int p = 2.0f*(4-i); 
    int s = (320-p*i)/(i+1); 
    layout.itemSize = CGSizeMake(s,s); 
    layout.minimumInteritemSpacing = p; 
    layout.minimumLineSpacing = p; 
    [self.collectionView setCollectionViewLayout:layout 
             animated:YES 
             completion:^(BOOL finished{ 
              [[NSNotificationCenter defaultCenter] postNotificationName:@"collectionViewLayoutDidChange" object:nil]; 
             }]; 
} 

ImageView наблюдает уведомление и перерисовывает:

//ImageView.m 
// 
-(void)awakeFromNib{ 
    [super awakeFromNib]; 
    [self setContentMode:UIViewContentModeScaleAspectFit]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:@"collectionViewLayoutDidChange" object:nil]; 
} 

//I also added the following method prototype to ImageView.h 
-(void)didReceiveNotification:(NSNotification *)notification{ 
    if ([notification.name isEqualToString:@"collectionViewLayoutDidChange"]){ 
     [self drawImage]; 
     return; 
    } 
}