Удаление маски CAShapeLayer на слое UIButton, чтобы анимированное изменение размера UIButton было не маскировано - PullRequest
4 голосов
/ 04 октября 2011

У меня есть UIButton с пользовательским типом кнопки, где я просто устанавливаю цвет фона и границы для нижележащего CALayer кнопки. Затем я применил маску к этому нижележащему слою, состоящему из CAShapeLayer (чтобы получить два закругленных угла), как описано в этом посте .

Пока все хорошо. Я оживляю UIButton, чтобы расти в размерах. Все идет нормально. См. Ниже (все на изображении - _fusedBar, сохраните фрагмент строки оси x, который вы видите под ним, и текст суммы в долларах).

fully grown UIButton referred to in code as _fusedBar

Когда я иду, чтобы анимировать UIB-кнопку для сжатия, используя ту же процедуру анимации, но с разными значениями параметров (аффинный перевод с одновременным изменением высоты кадра), ни один из UIB-кнопки (за исключением полоски) не виден, поскольку происходит сжатие.

Я пытался удалить CAShapeLayer, который является маской, из своего суперслоя, я пытался установить для свойства маски на слое UIButton значение nil и т. Д., Но ни один из них не удалял маску так, чтобы Я вижу анимацию UIButton (сжатие с аффинным переводом и изменением высоты кадра).

Вот соответствующий код анимации:

// Stackoverflow readers: Assume 'duration', 'scaledHeight' and 'delay' 
// already defined.

void (^fusedBarChange)(void) = ^{    
    _fusedBar.transform = CGAffineTransformMakeTranslation(0, -scaledHeight);
    [_fusedBar nd_setNewSizeHeight:scaledHeight];
};

[UIView animateWithDuration:duration
                      delay:delay
                    options:UIViewAnimationCurveEaseOut 
                 animations:^(void) {
                     fusedBarChange();
                 }
                 completion:^(BOOL finished) {
                     // Other stuff not relevant to _fusedBar animation
                 }];

Перед тем, как вызывать эту анимацию, я настроил маску в соответствии с приведенным выше сообщением. Этот код ниже. Обратите внимание, что «_fusedBar» - это UIB-кнопка, которая лежит в основе этого обсуждения.

- (void)configureRoundedTop {
    // YES: Start by creating the path (with only the top-left corner rounded)
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_fusedBar.bounds 
                                                   byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
                                                         cornerRadii:CGSizeMake(4.0, 4.0)];

    // Create the shape layer and set its path
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = _fusedBar.bounds;
    maskLayer.path = maskPath.CGPath;

    // Set the newly created shape layer as the mask for the image view's layer
    _fusedBar.layer.mask = maskLayer;
}

При увеличении _fusedBar со среза до нескольких сотен точек рост анимируется, и вы можете его увидеть.

Прежде чем использовать эту маску CAShapeLayer, при сжатии _fusedBar обратно до осколка я мог видеть анимацию (тот же код выше, просто другое значение для 'scaledHeight'). Теперь я не вижу уменьшающуюся анимацию.

Итак, я знаю, что мне нужно как-то стряхнуть эффекты маскирующего слоя перед анимацией операции сжатия, но очевидные вещи (для меня) не сработали. Вот пример различных вещей, которые я пробовал:

// None of these do the trick. I call them just before 
// the shrinking animation is invoked:
[_fusedBar setNeedsLayout];
[_fusedBar setNeedsDisplay];
[_fusedBar.layer.mask removeFromSuperlayer];
_fusedBar.layer.mask = nil;

Очевидно, мне не хватает самородка CALayers, маскировки и, возможно, даже семантики представления Layer.

Любое руководство высоко ценится!

1 Ответ

0 голосов
/ 07 октября 2011

Возвращаясь к нему через пару дней, я увидел свою ошибку (не видно из выписок, опубликованных выше).

По существу, после анимации, чтобы увеличить или уменьшить "fusedBar", я повторно применял маску на основе кадра представления.Поскольку это будет эффективно выполняться совместно с блоком анимации, у него будет маска, в которую сжимается представление.

Мне нужно было поместить этот код маски повторного применения в мой блок завершения анимации или подавить его.если fusedBar уменьшался.

Спасибо всем, кто обратился за помощью!

...