UIView: Как анимировать кадр CALayer с тенью? - PullRequest
0 голосов
/ 03 марта 2012

Я добавил теневой слой как подслой к слою UIView.Ниже приведен добавленный метод для UIView подкласса:

- (void)addDefaultShadowSubview {
    self.shadowSubview = [[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height)] autorelease];

    CALayer *shadowLayer = [CALayer layer];
    shadowLayer.backgroundColor = self.backgroundColor.CGColor;
    shadowLayer.shadowOffset = CGSizeMake(0, 3);
    shadowLayer.shadowRadius = 5.0;
    shadowLayer.shadowColor = [UIColor blackColor].CGColor;
    shadowLayer.shadowOpacity = 0.8;

    shadowLayer.frame = self.shadowSubview.frame;

    [self.shadowSubview.layer addSublayer:shadowLayer];

    self.shadowSubview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self addSubview:self.shadowSubview];
    [self sendSubviewToBack:self.shadowSubview];
}

Я хотел бы сохранить его как часть анимации изменения размера UIView с shadowSubview.Но не могу найти правильный способ сделать это, используя + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

[UIView animateWithDuration:durationDefaultAnimation
                     animations:^{
                         [self.viewWithShadowSubview setFrame:enlargedFrame];
                     }
                     completion:^(BOOL finished) {
                         [self modifyInsetForCurrentImageviewWithAnimation:YES];
                     }];

Пожалуйста, помогите мне узнать правильный путь.Пытался узнать о CABasicAnimation, но не может найти способ применить его к этому делу.

Ответы [ 3 ]

1 голос
/ 19 марта 2012

Я предлагаю также установить свойство shadowPath теневого слоя и затем обратиться к Анимация свойства shadowPath CALayer для реализации анимации пути тени.

0 голосов
/ 13 февраля 2018

Кадр слоя слоя и анимация тени: Вы можете нанести тень на сам CALayer и настроить кадр. Или используйте другой слой для тени и рамки, а затем анимируйте его в соответствии с вашими требованиями.

Я написал один пример кода, который работал для меня ..

    //change in CALayer frame
    let startFrame = CGRect.init(x: -5, y: -5, width: view.frame.size.width+10, height: view.frame.size.height+10)
    let endFrame = CGRect.init(x: -15, y: -15, width: view.frame.size.width+30, height: view.frame.size.height+30)

    //Frame
    let layer = CALayer.init()
    layer.frame = startFrame
    layer.borderWidth = 3.0
    layer.borderColor = UIColor.white.cgColor
    layer.backgroundColor = UIColor.clear.cgColor
    view.layer.addSublayer(layer)

    //Shadow
    view.layer.shadowRadius = 4.0
    view.layer.shadowColor = UIColor.black.cgColor
    view.layer.shadowOffset = CGSize.init(width: 3.0, height: 3.0)

    //Animaiton for shadow
    let animation = CABasicAnimation(keyPath: "shadowOpacity")
    animation.fromValue = 0.0
    animation.toValue = 0.9
    animation.duration = 5.0
    CATransaction.setCompletionBlock {

    }

    //Animation for Frame
    let baseAnimation = CABasicAnimation.init(keyPath: "bounds")
    baseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    baseAnimation.duration = 5.0
    baseAnimation.fromValue = NSValue.init(cgRect: startFrame)
    baseAnimation.toValue = NSValue.init(cgRect: endFrame)
    layer.frame = endFrame
    CATransaction.setCompletionBlock {

    }

    //Group animation - if u have multiple CA animation then group else no need to group it
    let animationGroup = CAAnimationGroup.init()
    animationGroup.duration = 5.0
    animationGroup.animations = [animation,baseAnimation]

    view.layer.add(animationGroup, forKey: nil)
0 голосов
/ 18 марта 2012

Установите тень прямо на shadowSubview, как сказал Дэвид.

Вы можете сделать это, заменив:

    - (void)addDefaultShadowSubview {
    self.shadowSubview = [[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height)] autorelease];

    CALayer *shadowLayer = [CALayer layer];
    shadowLayer.backgroundColor = self.backgroundColor.CGColor;
    shadowLayer.shadowOffset = CGSizeMake(0, 3);
    shadowLayer.shadowRadius = 5.0;
    shadowLayer.shadowColor = [UIColor blackColor].CGColor;
    shadowLayer.shadowOpacity = 0.8;

    shadowLayer.frame = self.shadowSubview.frame;

    [self.shadowSubview.layer addSublayer:shadowLayer];

    self.shadowSubview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self addSubview:self.shadowSubview];
    [self sendSubviewToBack:self.shadowSubview];
}

на

- (void)addDefaultShadowSubview {
    self.shadowSubview = [[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height)] autorelease];

    CALayer *self.shadowSubview.layer = [CALayer layer];
    self.shadowSubview.layer.backgroundColor = self.backgroundColor.CGColor;
    self.shadowSubview.layer.shadowOffset = CGSizeMake(0, 3);
    self.shadowSubview.layer.shadowRadius = 5.0;
    self.shadowSubview.layer.shadowColor = [UIColor blackColor].CGColor;
    self.shadowSubview.layer.shadowOpacity = 0.8;
}
...