Плохая производительность при вращении при использовании маски UIView

У меня есть пара UITableViews, которые должны исчезать вверху. Они размещаются рядом друг с другом в одном UIView. Поскольку все табличные представления должны исчезать в одном и том же месте, я решил, что должен установить альфа-маску в контейнере UIView. Это отлично работает, прокрутка плавная во всех представлениях таблицы, а затухание выглядит красиво.

Проблема заключается в изменении ориентации интерфейса. Это ДЕЙСТВИТЕЛЬНО изменчиво. И только при нанесении маски. Если убрать фейд, то все гладко.

Это код для применения указанной маски:

// If you want the Table Views to "fade out" at the top, use this function to set the height!
- (void) setFadeHeight:(CGFloat)fadeHeight
{
    if (fadeHeight == 0.0) {
        self.layer.mask = nil;
        return;
    }

    // Create a gradient layer to use as mask
    CAGradientLayer *l = [self createGradientLayerWithHeight:fadeHeight];
    l.shouldRasterize = NO;
    [self.layer setMask:l];
}

// Creates a transparency gradient. Helper function for the above function
- (CAGradientLayer *) createGradientLayerWithHeight:(CGFloat)gradientHeight
{
    CAGradientLayer *mask = [CAGradientLayer layer];
    mask.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0],
                      [NSNumber numberWithFloat:1.0],
                      nil];

    mask.colors = [NSArray arrayWithObjects:
                   (__bridge id)[UIColor clearColor].CGColor,
                   (__bridge id)[UIColor whiteColor].CGColor,
                   nil];

    mask.frame = CGRectMake(0.0, 0.0, self.bounds.size.width, self.bounds.size.height);

    // vertical direction
    mask.startPoint = CGPointMake(0.0, 0.0); 
    mask.endPoint = CGPointMake(0.0, gradientHeight / self.bounds.size.height);
    return mask;
}

Проблема может быть связана с этим вопросом о переполнении стека, но поскольку у меня плавная прокрутка в таблицах, я не уверен. Я также попытался установить для параметра shouldRasterize значение NO в соответствии с ответами на этот вопрос.


person Accatyyc    schedule 13.06.2012    source источник
comment
Что произойдет, если вы удалите маску в willRotateToInterfaceOrientation:duration: и добавите ее обратно в didRotateFromInterfaceOrientation:? Как это выглядит? Выглядит странно, что маска не применялась во время вращения?   -  person David Rönnqvist    schedule 13.06.2012
comment
Да, выглядит нормально. Но это беспокоит, когда вы знаете, что это там. Это придется сделать, если никто не придумает лучшего решения. Спасибо.   -  person Accatyyc    schedule 13.06.2012