iOS實(shí)現(xiàn)左右拖動(dòng)抽屜效果
本文實(shí)例介紹了iOS實(shí)現(xiàn)左右拖動(dòng)抽屜效果,具體內(nèi)容如下
利用了觸摸事件滑動(dòng) touchesMoved: 來(lái)觸發(fā)左右視圖的出現(xiàn)和消失 利用loadView方法中添加view 在self.view載入前就把 左右中View都設(shè)置好frame 每一個(gè)方法都由單獨(dú)的功能。
#import "DarwViewController.h" @interface DarwViewController () @property (nonatomic, weak) UIView *leftView; @property (nonatomic, weak) UIView *rightView; @property (nonatomic, weak) UIView *mainView; /** * 動(dòng)畫是否進(jìn)行 */ @property (nonatomic ,assign) BOOL animating; @end @implementation DarwViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)loadView { self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds]; //左邊view UIView *leftView = [[UIView alloc]initWithFrame:self.view.frame]; [self.view addSubview:leftView]; leftView.backgroundColor= [UIColor redColor]; self.leftView = leftView; //右邊View UIView *rightView = [[UIView alloc]initWithFrame:self.view.frame]; [self.view addSubview:rightView]; rightView.backgroundColor= [UIColor blueColor]; self.rightView = rightView; //主頁(yè)面 UIView *mainView = [[UIView alloc]initWithFrame:self.view.frame]; [self.view addSubview:mainView]; mainView.backgroundColor= [UIColor yellowColor]; self.mainView = mainView; //KVO監(jiān)聽(tīng) [self.mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; } /** * KVO回調(diào)方法 當(dāng)mainView Frame值改變時(shí)觸發(fā) * * @param keyPath <#keyPath description#> * @param object <#object description#> * @param change <#change description#> * @param context <#context description#> */ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if (self.animating) return; //如果mainView正在動(dòng)畫 就不執(zhí)行 if (self.mainView.frame.origin.x > 0 ) { //X > 0 就隱藏右邊View 顯示左邊View self.rightView.hidden = YES; self.leftView.hidden = NO; } else if (self.mainView.frame.origin.x < 0) { //X < 0 就隱藏左邊View 顯示右邊VIew self.leftView.hidden = YES; self.rightView.hidden = NO; } } #pragma mark -- 觸摸事件 -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //獲得觸摸對(duì)象 UITouch *touch = [touches anyObject]; //獲得當(dāng)前觸摸點(diǎn) CGPoint currentPoint = [touch locationInView:self.view]; //獲得上一個(gè)觸摸點(diǎn) CGPoint previousPoint = [touch previousLocationInView:self.view]; //計(jì)算x方向的偏移量 CGFloat offsetX = currentPoint.x - previousPoint.x; // 根據(jù)x的偏移量計(jì)算y的偏移量 self.mainView.frame = [self rectWithOffsetX:offsetX]; } #define screenW [UIScreen mainScreen].bounds.size.width #define screenH [UIScreen mainScreen].bounds.size.height /** * 計(jì)算主視圖的frame * * @param offsetX x的偏移量 * * @return 偏移后新的frame */ - (CGRect ) rectWithOffsetX:(CGFloat )offsetX { //Y軸的偏移量 CGFloat offsetY = (screenH *1/5) * (offsetX/screenW); //比例 :(用于寬高的縮放) CGFloat scale = (screenH - offsetY *2) / screenH; if (self.mainView.frame.origin.x < 0 ) { //如果x是負(fù)數(shù) 及左邊View要顯示 //比例就要設(shè)為比1小 scale = 2 - scale; } //獲取當(dāng)前mainView的frame CGRect frame = self.mainView.frame; //重新設(shè)置mainView的frame值 frame.size.width = frame.size.width *scale >screenW ? screenW : frame.size.width *scale; frame.size.height = frame.size.height *scale >screenH ? screenH :frame.size.height *scale; frame.origin.x += offsetX; frame.origin.y =(screenH - frame.size.height)*0.5; //返回偏移后新的frame return frame; } #define maxRightX (screenW *0.8) #define maxLeftX (-screenW *0.6) -(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { CGFloat targetX = 0; //如果松手的那一下 當(dāng)前mainVIew的x大于屏幕的一半 if (self.mainView.frame.origin.x > screenW * 0.5) { //向右邊定位 targetX = maxRightX; } //如果松手的那一下 當(dāng)前mainVIew的最大X值小于屏幕的一半 else if (CGRectGetMaxX(self.mainView.frame) < screenW *0.5) { //向左邊定位 targetX = maxLeftX; } //計(jì)算偏移量 CGFloat offsetX = targetX -self.mainView.frame.origin.x; self.animating = YES; [UIView animateWithDuration:0.4 animations:^{ if (targetX == 0) { //如果targetX==0 復(fù)位 self.mainView.frame = self.view.frame; } else { //如果targetX != 0 那就到指定位置 self.mainView.frame = [self rectWithOffsetX:offsetX]; } } completion:^(BOOL finished) { self.animating = NO; }]; } @end
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- iOS開(kāi)發(fā)之路--仿網(wǎng)易抽屜效果
- IOS中MMDrawerController第三方抽屜效果的基本使用示例
- iOS實(shí)現(xiàn)簡(jiǎn)單的抽屜效果
- iOS實(shí)現(xiàn)側(cè)拉欄抽屜效果
- IOS中Swift仿QQ最新版抽屜側(cè)滑和彈框視圖
- IOS實(shí)現(xiàn)點(diǎn)擊滑動(dòng)抽屜效果
- ios仿側(cè)邊抽屜效果實(shí)現(xiàn)代碼
- iOS實(shí)現(xiàn)簡(jiǎn)單抽屜效果
- iOS實(shí)現(xiàn)簡(jiǎn)易抽屜效果、雙邊抽屜效果
- iOS簡(jiǎn)單抽屜效果的實(shí)現(xiàn)方法
相關(guān)文章
iOS中一行代碼實(shí)現(xiàn) UIView 鏤空效果
這篇文章主要介紹了一行代碼實(shí)現(xiàn) UIView 鏤空效果,這是一種實(shí)現(xiàn) UIView 鏤空效果的方案,可以快速實(shí)現(xiàn)任意形狀的鏤空、文字的鏤空、帶鏤空的毛玻璃效果等。需要的朋友可以參考下2018-11-11iOS開(kāi)發(fā)之使用Storyboard預(yù)覽UI在不同屏幕上的運(yùn)行效果
使用Storyboard做開(kāi)發(fā)效率非常高,為了防止在團(tuán)隊(duì)中發(fā)生沖突,采取的解決辦法是負(fù)責(zé)UI開(kāi)發(fā)的同事最好每人維護(hù)一個(gè)Storyboard, 公用的組件使用輕量級(jí)的xib或者純代碼來(lái)實(shí)現(xiàn),下面小編就給大家介紹如何使用Storyboard預(yù)覽UI在不同屏幕上的運(yùn)行效果,需要的朋友可以參考下2015-08-08移動(dòng)web開(kāi)發(fā)技能之touch事件詳解
這篇文章主要為大家介紹了移動(dòng)web開(kāi)發(fā)技能之touch事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09解決Flutter出現(xiàn)CocoaPods報(bào)錯(cuò)情況(Mac和IOS)
這篇文章主要為大家介紹了解決Flutter出現(xiàn)CocoaPods報(bào)錯(cuò)情況(Mac和IOS)的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08iOS登錄時(shí)驗(yàn)證手機(jī)號(hào)與倒計(jì)時(shí)發(fā)送驗(yàn)證碼問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于iOS登錄時(shí)驗(yàn)證手機(jī)號(hào)與倒計(jì)時(shí)發(fā)送驗(yàn)證碼問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2019-01-01iOS UITextField最大字符數(shù)和字節(jié)數(shù)的限制詳解
在開(kāi)發(fā)中我們經(jīng)常遇到這樣的需求:在UITextField或者UITextView中限制用戶可以輸入的最大字符數(shù)。但在UITextView , UITextfield 中有很多坑,網(wǎng)上的方法也很多。但是并不是很全面吧,這里全面進(jìn)行了總結(jié),有需要的朋友們可以參考借鑒,下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11IOS開(kāi)發(fā)過(guò)程中的消息通知--小紅點(diǎn)
本文主要介紹了IOS開(kāi)發(fā)過(guò)程中的消息通知--小紅點(diǎn)的相關(guān)知識(shí)。大致分為兩種方法:系統(tǒng)方法和自定義方法。下面跟著小編一起來(lái)看下吧2017-04-04詳解iOS WebDriverAgent 環(huán)境搭建
這篇文章主要介紹了詳解iOS WebDriverAgent 環(huán)境搭建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01