如何通过自定义转场方法来实现底部弹出购物车栏
1.首先创建一个购物车弹出栏的类,布置好界面,然后重写购物车弹出栏类的init构造方法。在构造方法中设置self的转场模式为自定义,代码如下:
self.modalPresentationStyle = UIModalPresentationCustom;
2.在init重写的构造方法中设置self的转场代理为self,代码如下:
self.transitioningDelegate = self;
3.在购物车弹出栏类中实现代理方法
-(UIPresentationController*)presentationControllerForPresentedViewController:(UIViewController*)presented presentingViewController:(UIViewController*)presenting sourceViewController:(UIViewController*)source{
return[[MTPresentationControlleralloc]initWithPresentedViewController:presentedpresentingViewController:presenting];
}
此时注意上述代理方法,返回的是一个UIPresentationController类,这个类需要我们自己定义一个新类,来继承UIPresentationController。并且将新类构造出来返回。然后在这个新类中 在转场时对需要被展示的视图和正在展示的视图进行各种操作。
4.在新创建的UIPresentationController类中,要重写-(void)containerViewWillLayoutSubviews{} 这个方法(不要重写构造方法,不会起作用的)。
在containerViewWillLayoutSubviews这个方法中,我们可以获取到容器视图,正在展示的视图和将要被展示的视图。还可以往容器视图中插入新增的各种视图。在这个方法中就可以对得到的各种视图进行转场时的各种操作啦,然后这些操作就可以在转场发生的时候来触发。
代码如下:
-(void)containerViewWillLayoutSubviews{
//获得容器视图
UIView*containerView = [selfcontainerView];
//修改window的背景颜色
[UIApplicationsharedApplication].keyWindow.backgroundColor= [UIColorblackColor];
//获得正在展示的Controller
UIViewController*presentingController = [selfpresentingViewController];
[UIViewanimateWithDuration:0.5animations:^{
presentingController.view.transform=CGAffineTransformMakeScale(0.9,0.9);
}];
//设置一个半透明的遮罩
UIView*coverView = [[UIViewalloc]initWithFrame:containerView.frame];
coverView.backgroundColor= [UIColorcolorWithWhite:0.7alpha:0.5];
[containerViewinsertSubview:coverViewatIndex:0];
_coverView= coverView;
//给遮罩添加手势
UITapGestureRecognizer*tapGesture = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(clickTapGesture)];
[coverViewaddGestureRecognizer:tapGesture];
//设置presentatedView的视图
CGFloatpresentedH =300;
CGFloatpresentedY = containerView.height- presentedH;
UIView*presentedView =self.presentedView;
presentedView.frame=CGRectMake(0, presentedY, containerView.width, presentedH);
}