国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

IOS仿今日頭條滑動導航欄

2020-07-26 03:28:54
字體:
供稿:網(wǎng)友

之前在武林網(wǎng)平臺給大家分享了網(wǎng)易首頁導航封裝類、網(wǎng)易首頁導航封裝類優(yōu)化,今天在前兩個的基礎(chǔ)上仿下今日頭條。

1.網(wǎng)易首頁導航封裝類中主要解決了上面導航的ScrollView和下面的頁面的ScrollView聯(lián)動的問題,以及上面導航欄的便宜量。

2.網(wǎng)易首頁導航封裝類優(yōu)化中主要解決iOS7以上滑動返回功能中UIScreenEdgePanGestureRecognizer與ScrollView的滑動的手勢沖突問題。

今天仿今日頭條滑動導航和網(wǎng)易首頁導航封裝類優(yōu)化相似,這個也是解決手勢沖突,UIPanGestureRecognizer與ScrollView的手勢沖突。

一、ViewController的層次

用上面的圖來介紹,左側(cè)的個人頁面ViewController上面通過addChildViewController添加了一個以MainViewController為RootViewController的

UINavigationController,通過addSubview將UINavigationController的View添加到個人頁面ViewController的View上。

二、仿今日頭條滑動導航主要有3個問題:

1.UIPanGestureRecognizer與ScrollView的手勢沖突

為了達到拖動滑動的效果,需要給MainViewController添加一個UIPanGestureRecognizer,由于底部是ScrollView和TableView組成的,所以會使UIPanGestureRecognizer與底部的沖突,和網(wǎng)易首頁導航封裝類優(yōu)化類似需要在

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer中根據(jù)gestureRecognizer返回YES來使ScrolView和UIPanGestureRecognizer都識別。

2.UIPanGestureRecognizer滑動結(jié)束的位置不正確

用UIPanGestureRecognizer滑動根據(jù)便宜量來改變UINavigationController的View的位置,在今日頭條中滑動結(jié)束時UINavigationController的View要么在原位要么在右側(cè),不會停在中間,這個問題讓我想起了之前做的果凍效果,手勢有狀態(tài)state,根據(jù)手勢的狀態(tài)來改變UINavigationController的View的位置,特別是在手勢結(jié)束時。

3.由于1使ScrolView和UIPanGestureRecognizer都識別,導致返回時ScrolView也會滑動

讓底部的ScrolView能滑動的時間應(yīng)該是UINavigationController的View在初始位置frame的x為0,所以在它的frame的x>0時,底部的bottomScrollView的scrollEnabled=NO。

三、 主要實現(xiàn)代碼(導航的代碼就不貼了,只貼主要的)

1.聲明一個拖動手勢

@property(nonatomic,strong) UIPanGestureRecognizer *panGestureRecognizer;

2.為MainViewController添加手勢

_panGestureRecognizer=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];_panGestureRecognizer.delegate=self;[self.navigationController.view addGestureRecognizer:_panGestureRecognizer]; 

3.手勢識別的方法

//平移-(void)panGesture:(UIPanGestureRecognizer*)pan{//在View中的位置// CGPoint point=[pan locationInView:self.navigationController.view];//在View中的移動量 以手指按下的為原點CGPoint point1=[pan translationInView:self.navigationController.view];if (pan.state==UIGestureRecognizerStateChanged&&pan==_panGestureRecognizer) {if (point1.x>0&&self.navigationController.view.frame.origin.x<self.navigationController.view.frame.size.width-100) {float x= self.navigationController.view.frame.origin.x+point1.x>self.navigationController.view.frame.size.width-100?self.navigationController.view.frame.size.width-100:self.navigationController.view.frame.origin.x+point1.x;self.navigationController.view.frame=CGRectMake(x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height);NSLog(@"%@",NSStringFromCGRect(self.navigationController.view.frame));}else if(point1.x<0){NSLog(@"aaa %f",self.navigationController.view.frame.origin.x);float x=self.navigationController.view.frame.origin.x+point1.x<0?0:self.navigationController.view.frame.origin.x+point1.x;self.navigationController.view.frame=CGRectMake(x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height);}}else if(pan.state==UIGestureRecognizerStateEnded){if (self.navigationController.view.frame.origin.x>self.navigationController.view.frame.size.width/3) {[UIView animateWithDuration:0.2 animations:^{self.navigationController.view.frame=CGRectMake(self.navigationController.view.frame.size.width-100, 0, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height);} completion:^(BOOL finished) {self.bottomScrollView.scrollEnabled=YES;}];}else{[UIView animateWithDuration:0.2 animations:^{self.navigationController.view.frame=CGRectMake(0, 0, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height);} completion:^(BOOL finished) {self.bottomScrollView.scrollEnabled=YES;}];}}//偏移量是增加的應(yīng)該設(shè)為0[pan setTranslation:CGPointZero inView:self.navigationController.view];}

4.手勢沖突解決

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{if (self.bottomScrollView.contentOffset.x<=0.0&&gestureRecognizer==_panGestureRecognizer) {if (self.navigationController.view.frame.origin.x>0) {self.bottomScrollView.scrollEnabled=NO;}else{self.bottomScrollView.scrollEnabled=YES;}return YES;}return NO;}

四、效果圖

以上所述是小編給大家分享的IOS仿今日頭條滑動導航欄,希望對大家有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴海县| 法库县| 八宿县| 玉龙| 白玉县| 安吉县| 桂东县| 思茅市| 康马县| 开封县| 托克逊县| 岳池县| 鸡东县| 灵武市| 太谷县| 唐河县| 甘孜县| 乌兰浩特市| 阿鲁科尔沁旗| 阿瓦提县| 错那县| 科技| 拉孜县| 广元市| 十堰市| 清流县| 徐州市| 德庆县| 土默特左旗| 甘肃省| 北京市| 镇巴县| 台南县| 通河县| 梅河口市| 双柏县| 柘城县| 天镇县| 沐川县| 都安| 洪雅县|