iphone弹出窗口效果的制作(Core animation, CALayer)
效果类似人人网微薄客户端的弹出效果
static CGFloat kTransitionDuration = 0.3; - (void)initView { UIWindow *window = [UIApplication sharedApplication].keyWindow; if (!window) { window = [[UIApplication sharedApplication].windows objectAtIndex:0]; } _backgroundView = [[UIView alloc] initWithFrame:window.bounds]; // 这个可以使背景变成灰色,类似UIAlertView弹出的效果 _backgroundView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.35]; // 叠加到window上,这样他的父窗口就无法再响应点击消息了. [window addSubview:_backgroundView]; self.frame = CGRectMake(10, 60, 300, 380); [_backgroundView addSubview:self]; self.backgroundColor = [UIColor orangeColor]; // 一系列动画效果, 先放大0.1, 在缩小0.1,随后还原原始大小,达到反弹效果 self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.05, 0.05); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:kTransitionDuration/1.5]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(bounceAnimationStopped)]; self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); [UIView commitAnimations]; } - (void)bounceAnimationStopped { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:kTransitionDuration/2]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)]; self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9); [UIView commitAnimations]; } - (void)bounce2AnimationStopped { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:kTransitionDuration/2]; self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0); [UIView commitAnimations]; }
如果想实现圆角的视图:
CALayer *subLayer = [CALayer layer]; subLayer.backgroundColor = [UIColor whiteColor].CGColor; subLayer.shadowOffset = CGSizeMake(0, 10); subLayer.shadowRadius = 5.0; subLayer.shadowColor = [UIColor blackColor].CGColor; subLayer.shadowOpacity = 0.8; subLayer.frame = CGRectMake(30, 30, 150, 190); subLayer.cornerRadius = 10; subLayer.borderColor = [[UIColor blackColor] colorWithAlphaComponent:0.75].CGColor; subLayer.borderWidth = 4; [self.layer addSublayer:subLayer];
// 如果在层上添加的视图如图片比父视图大,应该试用maskToBounds = YES;
花开花谢春不管,水暖水寒鱼自知.