Фрейм ячейки UICollectionView имеет десятичное исходное значение

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

Рекурсивное описание представления коллекции показывает, что центральная ячейка в таблице всегда имеет начало x, которое является десятичным значением:

 <UICollectionViewCell: 0xd98c1e0; frame = (242.5 0; 220 45); layer = <CALayer: 0xd98c270>> ...

Мои вопросы таковы: 1) может ли это быть причиной размытости изображения? и 2) Каков наилучший способ гарантировать, что ни одно из значений x и y не будет иметь десятичного значения? (Помимо расчета макета вручную)

Для справки, вот мой код UICollectionView:

//subclass UICollectionViewFlowLayout

@implementation LabelLayout

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
    return YES;
}

- (id)init
{
    self = [super init];
    if (self) {
        [self setup];
    }
    return self;
}

-(void)prepareLayout
{
    [super prepareLayout];
    _cellCount = [[self collectionView] numberOfItemsInSection:0];
}

- (void)setup
{
    self.itemSize = CGSizeMake(220.0f, 45.0f);
    self.sectionInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f);
    self.minimumLineSpacing = 10.0f;
    self.minimumInteritemSpacing = 20.0f;
}

@end

person jac300    schedule 30.07.2013    source источник


Ответы (1)


Это определенно вызовет размытие, поскольку все сглаживается на два пикселя (Примечание: на экране сетчатки вы не увидите никакого размытия, потому что каждая точка на самом деле представляет собой два пикселя, поэтому технически половина точек существует как один пиксель). Чтобы исправить это, вам, возможно, придется использовать CGRectIntegral, чтобы принудительно установить целочисленные границы кадра. Лучший способ сделать это:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    for (NSLayoutAttributes *attribute in attributes){
        attribute.frame = CGRectIntegral(attribute.frame);
    }
}

Вы должны сделать то же самое для layoutAttributesForItemAtIndexPath:.

person Civatrix    schedule 30.07.2013