iOS 自带的UIAlertView
与UIAlertController
功能非常局限,有时候需要我们自定义AlertView。
下面是我在完成自定义AlertView的方法。
思路:
1.解决视图问题,按照需求写一个View就行。
2.设置怎样的动画让视图弹出
3.自定义的AlertView 如何加在需要展示的视图上。
调用自定义的AlertView,要像调用系统的AlertView那样简单。我们可以根据系统的AlertView调用方法,来揣测它的实现方法。
第一步初始化,这儿我们需要初始化视图
第二步show,让视图弹出。系统的实现直接调用一个[alertView show]
,方法就实现了这一功能。我想这里它应该就是加在UIWindow
上的。
定制视图:首先需要个蒙板,当视图弹出时让整个也没无法交互。这里需要设置蒙板的透明度,再将弹出的视图加在蒙板上。(这里要注意的一点,父视图的透明度会影响子视图透明度。解决方法:调用 view.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.4]
,这样设置透明度不会影响子视图透明度)
调用show
方法:可以直接将视图加在window上 [[[UIApplication sharedApplication].delegate window] addSubview:self]
; 这里的self
即视图本身。
- (void)show
{
if (!_isShow) {
[[[UIApplication sharedApplication].delegate window] addSubview:self];
[self shakeToShow:_alertView];
_isShow = YES;
}
}
当用户点击『确定』或者『取消』按钮时。调用 [self removeFromSuperview]
; 就可以。
- (void)hideView {
[self removeFromSuperview];
}
接着是动画效果的实现
这个弹出效果 要有一种回弹的效果,需要设置多个值。这里我选择关键帧动画来完成。
代码如下:
- (void)shakeToShow:(UIView*)aView {
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
animation.duration = 0.5;
NSMutableArray *values = [NSMutableArray array];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
animation.values = values;
[aView.layer addAnimation:animation forKey:nil];
}