比來,看到很多多少Android上的抽屜後果,也不由得想要本身寫一個。在Android外面可以用SlidingDrawer,很便利的完成。IOS下面就只要本身寫了。其實道理很簡略就是 UIView 的挪動,和一些手勢的操作。
後果圖:
// // DrawerView.h // DrawerDemo // // Created by Zhouhaifeng on 12-3-27. // Copyright (c) 2012年 CJLU. All rights reserved. // #import <UIKit/UIKit.h> typedef enum { DrawerViewStateUp = 0, DrawerViewStateDown }DrawerViewState; @interface DrawerView : UIView<UIGestureRecognizerDelegate> { UIImageView *arrow; //向上拖拽時顯示的圖片 CGPoint upPoint; //抽屜拉出時的中間點 CGPoint downPoint; //抽屜壓縮時的中間點 UIView *parentView; //抽屜地點的view UIView *contentView; //抽屜外面顯示的內容 DrawerViewState drawState; //以後抽屜狀況 } - (id)initWithView:(UIView *) contentview parentView :(UIView *) parentview; - (void)handlePan:(UIPanGestureRecognizer *)recognizer; - (void)handleTap:(UITapGestureRecognizer *)recognizer; - (void)transformArrow:(DrawerViewState) state; @property (nonatomic,retain) UIView *parentView; @property (nonatomic,retain) UIView *contentView; @property (nonatomic,retain) UIImageView *arrow; @property (nonatomic) DrawerViewState drawState; @end
// // DrawerView.m // DrawerDemo // // Created by Zhouhaifeng on 12-3-27. // Copyright (c) 2012年 CJLU. All rights reserved. // #import "DrawerView.h" @implementation DrawerView @synthesize contentView,parentView,drawState; @synthesize arrow; - (id)initWithView:(UIView *) contentview parentView :(UIView *) parentview; { self = [super initWithFrame:CGRectMake(0,0,contentview.frame.size.width, contentview.frame.size.height+40)]; if (self) { // Initialization code contentView = contentview; parentView = parentview; //必定要開啟 [parentView setUserInteractionEnabled:YES]; //嵌入內容區域的配景 UIImage *drawer_bg = [UIImage imageNamed:@"drawer_content.png"]; UIImageView *view_bg = [[UIImageView alloc]initWithImage:drawer_bg]; [view_bg setFrame:CGRectMake(0,40,contentview.frame.size.width, contentview.bounds.size.height+40)]; [self addSubview:view_bg]; //頭部拉拽的區域配景 UIImage *drawer_handle = [UIImage imageNamed:@"drawer_handlepng.png"]; UIImageView *view_handle = [[UIImageView alloc]initWithImage:drawer_handle]; [view_handle setFrame:CGRectMake(0,0,contentview.frame.size.width,40)]; [self addSubview:view_handle]; //箭頭的圖片 UIImage *drawer_arrow = [UIImage imageNamed:@"drawer_arrow.png"]; arrow = [[UIImageView alloc]initWithImage:drawer_arrow]; [arrow setFrame:CGRectMake(0,0,28,28)]; arrow.center = CGPointMake(contentview.frame.size.width/2, 20); [self addSubview:arrow]; //嵌入內容的UIView [contentView setFrame:CGRectMake(0,40,contentview.frame.size.width, contentview.bounds.size.height+40)]; [self addSubview:contentview]; //挪動的手勢 UIPanGestureRecognizer *panRcognize=[[UIPanGestureRecognizer alloc] initWithtarget:self action:@selector(handlePan:)]; panRcognize.delegate=self; [panRcognize setEnabled:YES]; [panRcognize delaysTouchesEnded]; [panRcognize cancelsTouchesInView]; [self addGestureRecognizer:panRcognize]; //單擊的手勢 UITapGestureRecognizer *tapRecognize = [[UITapGestureRecognizer alloc]initWithtarget:self action:@selector(handleTap:)]; tapRecognize.numberOfTapsRequired = 1; tapRecognize.delegate = self; [tapRecognize setEnabled :YES]; [tapRecognize delaysTouchesBegan]; [tapRecognize cancelsTouchesInView]; [self addGestureRecognizer:tapRecognize]; //設置兩個地位的坐標 downPoint = CGPointMake(parentview.frame.size.width/2, parentview.frame.size.height+contentview.frame.size.height/2-40); upPoint = CGPointMake(parentview.frame.size.width/2, parentview.frame.size.height-contentview.frame.size.height/2-40); self.center = downPoint; //設置肇端狀況 drawState = DrawerViewStateDown; } return self; } #pragma UIGestureRecognizer Handles /* * 挪動圖片處置的函數 * @recognizer 挪動手勢 */ - (void)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:parentView]; if (self.center.y + translation.y < upPoint.y) { self.center = upPoint; }else if(self.center.y + translation.y > downPoint.y) { self.center = downPoint; }else{ self.center = CGPointMake(self.center.x,self.center.y + translation.y); } [recognizer setTranslation:CGPointMake(0, 0) inView:parentView]; if (recognizer.state == UIGestureRecognizerStateEnded) { [UIView animateWithDuration:0.75 delay:0.15 options:UIViewAnimationOptionCurveEaSEOut animations:^{ if (self.center.y < downPoint.y*4/5) { self.center = upPoint; [self transformArrow:DrawerViewStateUp]; }else { self.center = downPoint; [self transformArrow:DrawerViewStateDown]; } } completion:nil]; } } /* * handleTap 觸摸函數 * @recognizer UITapGestureRecognizer 觸摸辨認器 */ -(void) handleTap:(UITapGestureRecognizer *)recognizer { [UIView animateWithDuration:0.75 delay:0.15 options:UIViewAnimationOptionTransitionCurlUp animations:^{ if (drawState == DrawerViewStateDown) { self.center = upPoint; [self transformArrow:DrawerViewStateUp]; }else { self.center = downPoint; [self transformArrow:DrawerViewStateDown]; } } completion:nil]; } /* * transformArrow 轉變箭頭偏向 * state DrawerViewState 抽屜以後狀況 */ -(void)transformArrow:(DrawerViewState) state { //NSLog(@"DRAWERSTATE :%d STATE:%d",drawState,state); [UIView animateWithDuration:0.3 delay:0.35 options:UIViewAnimationOptionCurveEaSEOut animations:^{ if (state == DrawerViewStateUp){ arrow.transform = CGAff.netransformMakeRotation(M_PI); }else { arrow.transform = CGAff.netransformMakeRotation(0); } } completion:^(BOOL finish){ drawState = state; }]; } @end
以上就是本文的全體內容,願望對年夜家的進修有所贊助。
【IOS完成點擊滑動抽屜後果】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!