mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-01-21 04:22:56 +08:00
Definitions: - Headless layer: a CALayer without a delegate. - Mounted layer: a CALayer that has been flushed to the render server either via a runloop pump or via `[CATransaction flush]`. Context: MDCShadowLayer includes some logic for animating shadowPath changes alongside corresponding bounds animations. The intent is that, if `shadowPath` is changed then it attempts to inherit any animation traits from existing bounds-related animations, if they exist. This behavior was added in https://github.com/material-components/material-components-ios/pull/2523. This behavior enables changes to shadowPath (which are not animatable by UIView-based animations) to inherit existing UIView-based animations. Prior to this change, only bounds.size would be inspected for this piggy-backing behavior. While this works for UIView-based animations, which decompose `.frame` and `.bounds` animations into `bounds.size` and `bounds.origin`, this does not work for headless layers which directly animate the `bounds` property. E.g. the following snippet would piggy back as expected: ```objc [UIView animateWithDuration:0.1 animations:^{ someView.frame = CGRectMake(0, 0, 100, 50); someView.layer.shadowPath = [UIBezierPath bezierPathWithRect:someView.bounds].CGPath; }]; ``` But the following would not: ```objc [CATransaction begin]; [CATransaction setAnimationDuration:0.5]; shadowLayer.bounds = CGRectMake(0, 0, 100, 50); shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:shadowLayer.bounds].CGPath; [CATransaction commit]; ``` After this change, MDCShadowLayer will check for animations to `bounds` as well, increasing the likelihood that the shadowPath is able to piggy-back existing animations. This change is part of addressing https://github.com/material-components/material-components-ios/issues/8644