У меня есть UIButton с пользовательским типом кнопки, где я просто устанавливаю цвет фона и границы для нижележащего CALayer кнопки. Затем я применил маску к этому нижележащему слою, состоящему из CAShapeLayer (чтобы получить два закругленных угла), как описано в этом посте .
Пока все хорошо. Я оживляю UIButton, чтобы расти в размерах. Все идет нормально. См. Ниже (все на изображении - _fusedBar, сохраните фрагмент строки оси x, который вы видите под ним, и текст суммы в долларах).
Когда я иду, чтобы анимировать 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.
Любое руководство высоко ценится!