1. 程式人生 > >【IOS】實現IOS版的抽屜效果(點選,拖拽滑動)

【IOS】實現IOS版的抽屜效果(點選,拖拽滑動)

原文連結:http://blog.csdn.net/toss156/article/details/7400065

好像最近,看到好多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 = CGAffineTransformMakeRotation(M_PI);
                }else
                {
                     arrow.transform = CGAffineTransformMakeRotation(0);
                }
        } completion:^(BOOL finish){
               drawState = state;
        }];  
        
   
}

@end


這樣就是實現了,圖片是從360裡面摳出來,處理的不是很好,大家見諒。


相關推薦

IOS實現IOS抽屜效果滑動

原文連結:http://blog.csdn.net/toss156/article/details/7400065 好像最近,看到好多Android上的抽屜效果,也忍不住想要自己寫一個。在Android裡面可以用SlidingDrawer,很方便的實現。IOS上面就只有自

iOS抽屜效果、二級選單滑動

好像最近,看到好多Android上的抽屜效果,也忍不住想要自己寫一個。在Android裡面可以用SlidingDrawer,很方便的實現。IOS上面就只有自己寫了。其實原理很簡單就是 UIView 的移動,和一些手勢的操作。 // // 

React效果實現跳轉定位位置內含demo

錨點:超連結的一種形式,快速定位到想要看的位置,常用在文章目錄等位置。那麼問題來了React不支援原生錨點的書寫方式所以怎麼在React裡實現類似錨點的效果我的解題思路1.在 url裡 使用 anchor 引數2.頁面 解析 是否有anchor引數對應的id3.有對應id的話

Win10實現控制元件倒影效果

原文: 【Win10】實現控制元件倒影效果 先引入個小廣告: 最近買了臺小米盒子折騰下,發覺 UI 還是挺漂亮的,特別是主頁那個倒影效果。 (圖隨便找的,就是上面圖片底部的那個倒影效果。)   好了,廣告結束,迴歸正題,這個倒影效果我個人覺得是挺不錯的,那麼有沒有辦法在 Win10 中

Win10Win2D實現控制元件陰影效果

原文: 【Win10】【Win2D】實現控制元件陰影效果 學過 WPF 的都知道,在 WPF 中,為控制元件新增一個陰影效果是相當容易的。 <Border Width="100" Height="100" Background="Red">

HTML- 實現展開與收起效果

1.javascript實現 1.1 html <div id="box"> <div id="content"> <h4>皮質腕錶 水晶

Android自定義元件系列11——實現3D立體旋轉效果

package com.example.rotation3dview; import android.content.Context; import android.graphics.Camera; import android.graphics.Canvas; import android.graphic

LeetCode11. Container With Most Water盛最多水的容器-C++實現的三種方法

本題是Bloomberg的面試題。 問題描述:  一、第一種方法-暴力解法   當我們在面試時想不到解題的方法時,不妨使用暴力解法,雙重遍歷陣列。 當 i = 0 時,使用指標 j 遍歷陣列,找到第一輪的最大值 area: 當i = 2 ,使用指標 j 遍歷

後綴數組RMQHDU 6194 - string string string 2017ICPC沈陽網絡賽

namespace 記得 initial acmer panel tom 技術 one ack string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768

java日誌組件介紹common-logginglog4jslf4jlogback

微秒 是把 輸出重定向 gin ons java 循環 框架 log4j.jar common-logging common-logging是apache提供的一個通用的日誌接口。用戶可以自由選擇第三方的日誌組件作為具體實現,像log4j,或者jdk自帶的lo

shiro登錄經歷的流程執行ShiroAccountRealm doGetAuthenticationInfo經歷的過程

tor quest count ont lin etsec ret ebs com http://jinnianshilongnian.iteye.com/blog/2025656 攔截器機制。 在這裏 @Bean(name = "shiroFilter") pu

題解 P1879 玉米田Corn Fields 動態規劃狀態壓縮

bad sin 是否 editor infer nbsp 一行 als clas 題目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1

BZOJ1089[SCOI2003]嚴格n元樹高精度動態規劃

space mem www. ++ 只有一個 per ++i https 乘法 【BZOJ1089】[SCOI2003]嚴格n元樹(高精度,動態規劃) 題面 BZOJ 洛谷 題解 設\(f[i]\)表示深度為\(i\)的\(n\)元樹個數。然後我們每次加入一個根節點,然後枚

Ubuntu系統python3安裝模組不修改python2的軟連線

ubuntu系統是自帶python2.7(預設)和python3.4的,可以使用python -V和python3 -V檢視已安裝python版本。 但是在不同版本的python中ubuntu預設沒有安裝pip,所以需要自己手動安裝pip。 (1)在不同版本中安裝pip,可以使用一下命令:

BZOJ3625CF438E小朋友和二叉樹生成函式多項式求逆多項式開根NTT

Description 我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。 考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合{c[1],c[2],...,c[n]}中,我們的小朋友就會將其稱作神犇的。

SwiftUITableViewCell 中 TTTAttributedLabel 超連結無法的問題

前言   還以為是自己程式碼寫的有問題,用法和別的地方都一樣,但是這個是在 UITableViewCell 中使用,另外在 tableHeaderView 中使用也沒用這個問題 —— 使用 TTTAttributedLabel 識別超連結,能識別但是點選沒有跳轉。 宣告   歡迎轉載,但請保留文

簡記Java Web 內幕——Spring原始碼元件分析BeanFactory原始碼Bean建立之前

本章內容: Bean元件、Context元件解析 BeanFactory的建立 初始化Bean例項之前的操作 Bean元件解析 Spring Bean 的建立是典型的工廠模式, 它的頂級介面是BeanFactory。 Bean工廠的類層次關係

git強制覆蓋原生代碼與git遠端倉庫保持一致

git強制覆蓋:    git fetch --all    git reset --hard origin/master    git pullgit強制覆蓋本地命令(單條執行):    git fe

轉載支援向量機通俗導論理解SVM的三層境界

前言第一層、瞭解SVM  1.0、什麼是支援向量機SVM  1.1、線性分類  1.2、線性分類的一個例子  1.3、函式間隔Functional margin與幾何間隔Geometrical margin    1.3.1、函式間隔Functional margin    1.3.2、點到超平面的距離定

BZOJ1185[HNOI2007]最小矩形覆蓋凸包旋轉卡殼

tps 簡單的 double 所有 iostream ace str 覆蓋 cpp 【BZOJ1185】[HNOI2007]最小矩形覆蓋(凸包,旋轉卡殼) 題面 BZOJ 洛谷 題解 最小的矩形一定存在一條邊在凸包上,那麽枚舉這條邊,我們還差三個點,即距離當前邊的最遠點,以