【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 中
【Win10】【Win2D】實現控制元件陰影效果
原文: 【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
【LeetCode】11. Container With Most Water(盛最多水的容器)-C++實現的三種方法
本題是Bloomberg的面試題。 問題描述: 一、第一種方法-暴力解法 當我們在面試時想不到解題的方法時,不妨使用暴力解法,雙重遍歷陣列。 當 i = 0 時,使用指標 j 遍歷陣列,找到第一輪的最大值 area: 當i = 2 ,使用指標 j 遍歷
【後綴數組】【RMQ】HDU 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-logging,log4j,slf4j,logback )
微秒 是把 輸出重定向 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,可以使用一下命令:
【BZOJ3625】【CF438E】小朋友和二叉樹(生成函式,多項式求逆,多項式開根,NTT)
Description 我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。 考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合{c[1],c[2],...,c[n]}中,我們的小朋友就會將其稱作神犇的。
【Swift】UITableViewCell 中 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 洛谷 題解 最小的矩形一定存在一條邊在凸包上,那麽枚舉這條邊,我們還差三個點,即距離當前邊的最遠點,以