w moim przypadku zrobiłem to w ten sposób:
ustawiony instancji CAShapeLayer
jako własność maskować warstwy z widoku niestandardowego podklasa
@interface MyCustomView()
@property (nonatomic, strong) CircleShapeLayer *circleShapeLayer;
@end
@implementation MyCustomView
- (id) initWithFrame: (CGRect) frame {
self = [super initWithFrame: CGRectZero];
if (self) {
self.layer.mask = self.shapeLayer;
[self.layer.mask setValue: @(0) forKeyPath: @"transform.scale"];
}
return self;
}
zoom warstwa ta maska do pełnych rozmiarach. Kod z widoku:
- (void) zoom {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"transform.scale"];
animation.fromValue = [self.layer.mask valueForKeyPath: @"transform.scale"];
animation.toValue = @(1);
animation.duration = 2.0;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
animation.delegate = self;
// Important: change the actual layer property before installing the animation.
[self.layer.mask setValue: animation.toValue forKeyPath: animation.keyPath];
// Now install the explicit animation, overriding the implicit animation.
[self.layer.mask addAnimation: animation forKey: animation.keyPath];
return;
}
- (CAShapeLayer *) circleShapeLayer {
if (!_ circleShapeLayer) {
_circleShapeLayer = [SGMaskLayer layer];
_circleShapeLayer.delegate = _shapeLayer;
_circleShapeLayer.frame = self.bounds;
_circleShapeLayer.needsDisplayOnBoundsChange = YES;
}
return _circleShapeLayer;
}
@end
kod warstwy maski:
@interface CircleShapeLayer : CAShapeLayer
@end
@implementation CircleShapeLayer
- (void) drawLayer: (CALayer *) layer inContext: (CGContextRef) ctx {
UIGraphicsPushContext(ctx);
UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect: self.bounds];
self.path = circlePath.CGPath;
UIGraphicsPopContext();
}
@end
z dokumentacją:
kanał alfa warstwy określa, ile z treści warstwy i tła pokazuje przez. Pełne lub częściowe nieprzezroczyste piksele umożliwiają wyświetlanie przez bazowe treści przez całkowicie przezroczyste piksele, ale blokują tę zawartość.
Domyślna wartość tej właściwości to zero. Podczas konfigurowania maski pamiętaj o ustawieniu rozmiaru i położenia warstwy maski na , aby upewnić się, że jest odpowiednio wyrównana z warstwą, którą maskuje.
więc narysowałem okrąg z UIBezierPath, aby uzyskać okrągłą maskę. na początku ustawiam współczynnik skali maski na 0, więc nic z warstwy widoku nie jest widoczne. następnie współczynnik skali jest ustawiony na 1 (wypełniając granice warstwy), co daje przyjemną animację okręgu zwiększającego jego promień od środka.
Możesz potrzebować jeszcze jednej animacji przesuwającej środkowy punkt widoku. obie animacje można zawijać w grupie CAAnimationGroup.
myślę, że może pomóżcie, ale bądźcie pewni, proszę, proszę – user2732294
Mam nadzieję, że moje edycje uczyniły go nieco jaśniejszym. – hacker2007
@ hacker2007 Czy mógłbyś powiedzieć mi więcej szczegółów na temat "myView", "self.shapeLayer" i "self.layer"? –