2013-09-01 3 views
0

У меня есть представление коллекции, в котором каждая ячейка содержит 7 кнопок (созданных с помощью кода, а не раскадровки).Button Image Quality Collection View

Они изначально острые, однако, если я прокручиваю вверх/вниз несколько раз, качество уменьшается.

Резкость восстанавливается при изменении вида и возврата.

Любые идеи?

Addit:

Я делаю кнопки, как это, в цикле (может быть от 1 до 7 кнопок)

- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"patientCell"; 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 
    Patient *aPt = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    PatientCVCell *ptCell = (PatientCVCell *) cell; 
    ptCell.ptName.text = aPt.name; 
    ptCell.ptRoom.text = aPt.room; 
    ptCell.ptRx.text = aPt.diagnosis; 

    int xPos = 20; 
    NSArray *daysForRx = aPt.ofList.listDays; 
    // loop through to add button for each day of Rx 

    for (int i = 0; i < [daysForRx count]; i++) { 
     // get the treatment day that == postition in array 

     for (Treatment *t in aPt.patientRx) { 
      if (t.day == daysForRx[i]) { 
       //NSLog(@"%i", xPos); 
       StatusButton *testButton = [StatusButton buttonWithType:UIButtonTypeCustom]; 
       testButton.frame = CGRectMake(xPos, 110, 28, 28); 
       testButton.btnTreatment = t; 
       // match status of the RX to the correct button 

       if ([t.status intValue] == NotSeen) { 
        [testButton setImage:[UIImage imageNamed:@"toSee"] forState:UIControlStateNormal]; 
        testButton.linkNumber = NotSeen; 
       } 
       else if ([t.status intValue] == SeenNotCharted) { 
        [testButton setImage:[UIImage imageNamed:@"seenNotCharted"] forState:UIControlStateNormal]; 
        testButton.linkNumber = SeenNotCharted; 
       } 
       else if ([t.status intValue] == SeenCharted) { 
        [testButton setImage:[UIImage imageNamed:@"seenCharted"] forState:UIControlStateNormal]; 
        testButton.linkNumber = SeenCharted; 
       } 
       else if ([t.status intValue] == NotSeeing) { 
        [testButton setImage:[UIImage imageNamed:@"notSeeing"] forState:UIControlStateNormal]; 
        testButton.linkNumber = NotSeeing; 
       } 
       else if ([t.status intValue] == NotSeeingDC) { 
        [testButton setImage:[UIImage imageNamed:@"notSeeingDischarged"] forState:UIControlStateNormal]; 
        testButton.linkNumber = NotSeeingDC; 
       } 
       [testButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
       [cell addSubview:testButton]; 
       xPos = xPos + 36; 
      } 
     } 
    } 
    return cell; 
} 

Изображения правильного размера поэтому нет необходимости масштабировать изображение.

Происходит в тренажере и на устройстве.


После более пристального обзора внутренняя часть изображений является резкой! Таким образом, эта проблема связана с прозрачностью формы круга в форме квадратной кнопки!

+1

Просьба поделиться кодом, в противном случае его трудно понять, что происходит ... – Jailbroken

+1

Проверьте свои методы 'UICollectionViewDataSource' и' UICollectionViewDelegate' и ваш подкласс 'UICollectionViewCell' для кода, который может привести к «размытию». Сначала я бы посмотрел на все вычисления CGRect. Убедитесь, что ваши изображения совпадают с фактическим пикселем. Вы должны использовать floorf(), roundf() или ceilf() для следующего пикселя (что означает 1 pt на сетчатке и 0.5 pt на сетчатке). Смотрите: http://stackoverflow.com/questions/8844092/uiimageview-loses-quality-after-panning –

+0

попробовал и не повезло, я думаю, что это проблема памяти. Когда я прокручиваю свою память, использование медленно увеличивается - даже когда у меня есть пустой UICollectiveViewCell и нет содержимого. Проблема, кажется, в cellForRowAtIndexPath – DogCoffee

ответ

0

Вы декалируете ячейку, затем добавляете свои кнопки в ячейку.

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

Я бы добавил кнопки изнутри ячейки. Сохраните их в массиве, чтобы впоследствии их удалить. Затем я бы добавил метод для установки количества кнопок, которые вам понадобятся. Как это:

// header 
@property (strong, nonatomic) NSMutableArray *buttons; 

// implementation 
- (void)setNumberOfButtons:(NSInteger)numberOfButtons withTarget:(id)target selector:(SEL)selector { 
    // remove existing buttons from view 
    [self.buttons makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    // "save" existing buttons in a reuse queue so you don't have to alloc init them again 
    NSMutableArray *reuseQueue = self.buttons; 

    self.buttons = [NSMutableArray arrayWithCapacity:numberOfButtons]; 
    for (NSInteger i = 0; i < numberOfButtons; i++) { 
     UIButton *button = [reuseQueue lastObject]; 
     if (button) { 
      [reuseQueue removeLastObject]; 
     } 
     else { 
      button = [UIButton buttonWithType:UIButtonTypeCustom]; 
      // you should always use the same target and selector for all your cells. otherwise this won't work. 
      [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 
     } 
     [self.buttons addObject:button]; 
     button.frame = .... 
     // don't set up images or titles. you'll do this from the collectionView dataSource method 
    } 
} 

вы установите количество кнопок в collectionView:cellForItemAtIndexPath: и настроить каждую кнопку в соответствии с вашими потребностями. что-то вдоль этих линий:

- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    Cell *cell = ... dequeue ... 
    Object *object = ... get from your backend ... 
    /* configure your cell */ 
    if ([cell.buttons count] != object.numberOfItems) { 
     // no need to remove and add buttons if the item count stays the same 
     [cell setNumberOfButtons:object.numberOfItems withTarget:self selector:@selector(buttonPressed:)]; 
    } 
    for (NSInteger i = 0; i < [object.numberOfItems count]; i++) { 
     UIButton *button = cell.buttons[i]; 
     [button setImage:... forState:UIControlStateNormal]; 
    } 
} 

И действие будет выглядеть следующим образом:

- (IBAction)buttonPressed:(UIButton *)sender { 
    UICollectionView *collectionView; 
    CGPoint buttonOriginInCollectionView = [sender convertPoint:CGPointZero toView:collectionView]; 
    NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:buttonOriginInCollectionView]; 
    NSAssert(indexPath, @"can't calculate indexPath"); 
    Cell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 
    if (cell) { 
     NSInteger pressedButtonIndex = [cell.buttons indexOfObject:sender]; 
     if (pressedButtonIndex != NSNotFound) { 
      // do something 
     } 
    } 
    else { 
     // cell is offscreen?! why? 
    } 
} 

довольно прямо вперед. Получите indexPath, возьмите CollectionViewCell, проверьте, какой индекс нажата кнопка

+0

спасибо за подробный ответ – DogCoffee

+0

Мне не нужно было это делать, если бы я добавил кнопки в IB напрямую? Я сделал это как тест, и мои ассигнования все еще увеличиваются только при прокрутке вверх и вниз. – DogCoffee