亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

ios scrollview嵌套tableview同向滑動的示例

2019-10-21 18:43:50
字體:
來源:轉載
供稿:網友

我討論的問題是嵌套同向滑動,能避免盡量避免。最好用一個tableview實現。一個tableview不夠用了再嵌套,適用復雜場景。

首先我說下不適用的,免得大家浪費時間。

1.不適用上下拉刷新加載更多的頁面。

2.不適用點擊cell獲取點擊事件的頁面,可以加入button點擊獲取事件。

官方文檔說盡量不要進行兩個豎直或兩個水平方向滑動的視圖嵌套。因為這個時候機器不知道用戶要讓哪個滑動,但在我們這個神奇的國度,項目中經常出現這樣的需求,產品經理總愛這樣做,andriod那邊是比較容易實現的,ios/203996.html">ios這邊十分復雜,我研究了一天,寫了個demo,可以勉強實現,我的項目中就有上下拉,因此我就硬嵌套了,用戶滑動的時候不能準確地按自己的意愿滑動scrollview、tableview。就這樣了,這個沒有解決方案的。

我做到的效果是手點在哪個視圖上,哪個視圖就滾動,當小的scroll滾到到自己的臨界值就滾動大的scroll,當大的也到臨界值就不滾動。順便實現了一個偽懸浮的secView如果沒有那個懸浮的就把那個懸浮高度floatViewHeight置0。剩下的根據頁面調整frame即可通用。

這是效果圖

ios,scrollow嵌套webview,同向滑動,tableview同向滑動

下面我說一下在沒有以上兩點不適用的頁面的實現的思路:

Scrollview在控制器的view上,是一個大的視圖,tablewview在ScrollView上。根據拖拽手勢配合,先判斷首先觸摸點在哪個view上,再對哪個view滑動操作。解決手勢和button點擊沖突。下面看代碼,注釋十分清晰。github有demo,歡迎閱讀: https://github.com/qingyindaoren/ScrollInsetTable.git

核心代碼如下:

#import "ViewController.h"#import "YYGestureRecognizer.h"#import "ScrollTableViewCell.h"#import "MBProgressHUD+Add.h"#define ScreenWidth [UIScreen mainScreen].bounds.size.width#define ScreenHeight [UIScreen mainScreen].bounds.size.height//虛假的懸浮效果static CGFloat floatViewHeight = 30.0;static CGFloat navHeitht = 64;// 這個系數根據自己喜好設置大小,=屏幕視圖滑動距離/手指滑動距離#define moveScale 2@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,UIGestureRecognizerDelegate>@property (nonatomic,weak)UIScrollView *scroll;@property (nonatomic, strong) NSArray *titles;@property (nonatomic,weak)UITableView *insetTableView;@property (nonatomic,assign)CGFloat tableY;@property (nonatomic,assign)CGFloat tableStartY;@property (nonatomic,assign)CGFloat scrollY;@property (nonatomic,assign)CGFloat scrollStartY;//tableview 的y值 在scrollview中的位置@property (nonatomic,assign)CGFloat tableFrameY;@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib.  self.view.backgroundColor = [UIColor whiteColor];  self.title = @"ScrollScroll";// 有導航最上部視圖是scrollview 內部空間位置會下移,設置這個屬性后不下移。  if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {    self.automaticallyAdjustsScrollViewInsets = NO;  }  UIScrollView *scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0,navHeitht, ScreenWidth, ScreenHeight-navHeitht)];  scroll.backgroundColor = [UIColor colorWithRed:0.4 green:0.3 blue:0.2 alpha:1.0];;    [self.view addSubview:scroll];  self.scroll = scroll;      //根據需求設置tableview的y值 暫寫scroll高的2分之一   self.tableFrameY = self.scroll.frame.size.height/2;    UIImageView *headImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, self.tableFrameY-floatViewHeight)];  headImage.image = [UIImage imageNamed:@"scrollHead"];  headImage.contentMode = UIViewContentModeScaleAspectFill;  [self.scroll addSubview:headImage];    NSArray *titles = @[@"ICO詳情",@"央行放大招",@"比特幣會漲",@"神秘中本村"];  self.titles = titles;   UISegmentedControl *segment = [[UISegmentedControl alloc] initWithFrame:CGRectMake(5, scroll.bounds.size.height/2-30, self.scroll.bounds.size.width - 10, 30)];   [segment addTarget:self action:@selector(segmentValueChanged:) forControlEvents:UIControlEventValueChanged];  for (NSString *title in _titles) {    [segment insertSegmentWithTitle:title atIndex:segment.numberOfSegments animated:false];  }  segment.selectedSegmentIndex = 0;  [self.scroll addSubview:segment];    UITableView *insetTable = [[UITableView alloc]initWithFrame:CGRectMake(0,self.tableFrameY, self.view.bounds.size.width, ScreenHeight-navHeitht-floatViewHeight)];  insetTable.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0];    insetTable.dataSource = self;  insetTable.delegate = self;     [self.scroll addSubview:insetTable];  self.insetTableView = insetTable;  //github搜索 yykit 或yytext 里面有 yygestureRecognizer這個類,這個類需要做一些修改,  // 在yygesture中所有觸摸事件方法里 加上super的方法,原文件里沒有,否則響應鏈條中斷,scroll或tablew的按鈕點擊事件不執行。  //這個類原文件繼承于UIGestureRecognizer, 改為繼承于UIPanGestureRecognizer 否則點擊事件不執行。  //運行效果詳見我的demo  YYGestureRecognizer *yyges = [YYGestureRecognizer new];  yyges.action = ^(YYGestureRecognizer *gesture, YYGestureRecognizerState state){    if (state != YYGestureRecognizerStateMoved) return ;        if (CGRectContainsPoint(self.insetTableView.frame, gesture.startPoint)) {          //滑動tableview      [self tableScrollWithGesture:gesture];                 }else{            //滑動scrollview      [self scrollScrollWithGesture:gesture];          }   };  //必須給scroll 加上手勢 不要給view加,不然滑動tablew的時候會錯誤判斷去滑動scroll。  [self.scroll addGestureRecognizer:yyges];    //實現手勢代理,解決交互沖突  yyges.delegate = self;   scroll.contentSize = CGSizeMake(self.view.bounds.size.width, self.tableFrameY+self.insetTableView.frame.size.height);}//解決手勢按鈕沖突- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  //如果是 segment或scroll上的其他按鈕,取消手勢  if([NSStringFromClass(touch.view.superclass) isEqualToString:@"UIControl"]){    return NO;  }  //    return YES;    }//- (void)segmentValueChanged:(UISegmentedControl *)segment {//scroll 到底部  CGFloat offset = self.scroll.contentSize.height - self.insetTableView.bounds.size.height-floatViewHeight;  if (offset > 0)  {    self.scrollY = offset;    [self.scroll setContentOffset:CGPointMake(0, offset) animated:YES];  }  //TableView到頂部  self.tableY = 0;  [self.insetTableView setContentOffset:CGPointMake(0, self.tableY) animated:YES];}- (void)tableScrollWithGesture:(YYGestureRecognizer *)gesture{  CGFloat scrolly;    if (self.tableStartY != gesture.startPoint.y) {    scrolly = -(gesture.currentPoint.y-gesture.startPoint.y) ;  }else{    scrolly = -(gesture.currentPoint.y-gesture.lastPoint.y) ;  }  self.tableStartY = gesture.startPoint.y;    self.tableY += scrolly*moveScale;    //為了顯示底部超出屏幕的tableview那部分 滑動scrollview 此時tablewview已經滑動到了底部  if (self.tableY> self.insetTableView.contentSize.height-self.insetTableView.bounds.size.height){    self.scrollY += self.tableY-(self.insetTableView.contentSize.height-self.insetTableView.bounds.size.height);        //tablewview滑動到底部就不要滑了    self.tableY = self.insetTableView.contentSize.height-self.insetTableView.bounds.size.height;      //scrollview 滑動到了底部就不要滑動了    if (self.scrollY> self.scroll.contentSize.height-self.insetTableView.bounds.size.height-floatViewHeight){      self.scrollY = self.scroll.contentSize.height-self.insetTableView.bounds.size.height-floatViewHeight;      //如果scrollview意外的contentsize 小于自己的大小,scrollview就不要滑了      if (self.scrollY<0) {        self.scrollY = 0;      }          }    [self.scroll setContentOffset:CGPointMake(0, self.scrollY) animated:YES];        //如果tablewview的cell過少或行高過少致使其contentsize 小于自己的大小,tableview就不要滑了    if (self.tableY<0) {      self.tableY = 0;    }      }      //如果滑到了tableview的最上部,停止滑動tablewview, 如果此時scrollview 沒有在最上部就滑動scrollview到最上部  if (self.tableY<0){    self.scrollY += self.tableY;        //scroll已經在最上部了,scroll就不滑了    if (self.scrollY<0) {      self.scrollY = 0;    }        NSLog(@"scroll %lf",self.scrollY);    [self.scroll setContentOffset:CGPointMake(0, self.scrollY) animated:YES];         //停止滑動tablewview    self.tableY = 0;      }  NSLog(@"table %lf",self.tableY);      [self.insetTableView setContentOffset:CGPointMake(0, self.tableY) animated:YES];}- (void)scrollScrollWithGesture:(YYGestureRecognizer *)gesture{  CGFloat scrolly;    if (self.scrollStartY != gesture.startPoint.y) {    scrolly = -(gesture.currentPoint.y-gesture.startPoint.y) ;  }else{    scrolly = -(gesture.currentPoint.y-gesture.lastPoint.y) ;  }  self.scrollStartY = gesture.startPoint.y;    self.scrollY += scrolly*moveScale;    //如果滑到了scroll的底部就不要滑了  if (self.scrollY> self.scroll.contentSize.height-self.insetTableView.bounds.size.height-floatViewHeight){    self.scrollY = self.scroll.contentSize.height-self.insetTableView.bounds.size.height-floatViewHeight;    //如果scrollview意外的contentsize 小于自己的大小,scrollview就不要滑了    if (self.scrollY<0) {      self.scrollY = 0;    }  }  //如果滑到了scroll頂部就不要滑了  if (self.scrollY<0){    self.scrollY = 0;  }  NSLog(@"scroll %lf",self.scrollY);      [self.scroll setContentOffset:CGPointMake(0, self.scrollY) animated:YES];  }#pragma mark - 展示tableview的代理- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  return 70;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  return 10;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    ScrollTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"ScrollTableViewCell"];  if (!cell)  {    [tableView registerNib:[UINib nibWithNibName:@"ScrollTableViewCell" bundle:nil] forCellReuseIdentifier:@"ScrollTableViewCell"];    cell = [tableView dequeueReusableCellWithIdentifier:@"ScrollTableViewCell"];  }      cell.backgroundColor = [UIColor clearColor];        cell.selectionStyle = UITableViewCellSelectionStyleNone;  cell.Titletext.text = [NSString stringWithFormat:@"/t第%zd行",indexPath.row];  cell.detailText.text = @"滑屏呀滑屏呀劃呀";  cell.detailText.textColor = self.navigationController.navigationBar.tintColor;  cell.indexPath = indexPath;    cell.selectCellBlock = ^(NSIndexPath *indexPath) {    NSString *tip = [NSString stringWithFormat:@"點擊了第%ld組%ld行",indexPath.section,indexPath.row];;    [MBProgressHUD showMessage:tip view:nil];        NSLog(@"%@",tip);  };    return cell;}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{    return 3;}-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{  UIView *v = [[UIView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, 50)];  v.backgroundColor = [UIColor orangeColor];  UILabel *l = [[UILabel alloc]initWithFrame:v.bounds];  l.text =[NSString stringWithFormat:@"tableview的組頭%ld",section];  l.textColor = [UIColor whiteColor];  l.textAlignment = NSTextAlignmentCenter;  [v addSubview:l];  return v;}//組頭高-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{    return 50;    }//這個方法不可用了,除非點擊了cellcontenview之外的區域 只能同過加按鈕的方式接受點擊事件-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{  NSLog(@"點擊了第%ld行",indexPath.row);}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲开心激情网| 国产精品视频永久免费播放| 欧美日韩免费看| 亚洲欧美一区二区激情| 欧美激情视频在线免费观看 欧美视频免费一| 最近日韩中文字幕中文| 国产日韩精品在线| 欧洲精品毛片网站| 亚洲精品久久久久久久久久久久| 精品无人国产偷自产在线| 亚洲国产欧美久久| 国产日韩在线精品av| 92国产精品久久久久首页| 亚洲人av在线影院| 97精品久久久中文字幕免费| 日韩精品亚洲视频| 久久精品国产96久久久香蕉| 91免费看片在线| 久久影院中文字幕| 亚洲精品资源在线| 日本精品中文字幕| 亚洲精品中文字幕av| 成人av电影天堂| 久久天天躁狠狠躁夜夜爽蜜月| 久久久97精品| 久久精品人人做人人爽| 国产精品一区二区三区免费视频| 日本久久久久久久| 国产一区二区日韩| 精品高清美女精品国产区| 国产一区红桃视频| 国产欧美日韩精品丝袜高跟鞋| 国内外成人免费激情在线视频网站| 久久在线精品视频| 国产亚洲一级高清| www.日韩.com| 日韩在线激情视频| 欧美极品少妇与黑人| 午夜欧美不卡精品aaaaa| 欧美性猛交99久久久久99按摩| 久久精品国产一区二区三区| 美女视频黄免费的亚洲男人天堂| 全球成人中文在线| 欧美高清一级大片| 亚洲高清不卡av| 国产日韩欧美在线| 国产成人精品久久| 高清在线视频日韩欧美| 91色在线观看| 狠狠躁夜夜躁久久躁别揉| 777午夜精品福利在线观看| 欧美视频免费在线| 日韩成人av网址| 俺去亚洲欧洲欧美日韩| 国产欧美日韩精品丝袜高跟鞋| 九九久久精品一区| 岛国av一区二区三区| 国产精品精品一区二区三区午夜版| 国产精品久久久久久久久久免费| 亚洲精品suv精品一区二区| 亚洲天堂影视av| 欧美成人在线网站| 日韩欧美国产一区二区| 亚洲精品资源美女情侣酒店| 日韩免费观看在线观看| 欧美一乱一性一交一视频| 亚洲qvod图片区电影| 日韩欧美亚洲一二三区| 国产精品私拍pans大尺度在线| 亚洲自拍小视频免费观看| 日韩在线高清视频| 米奇精品一区二区三区在线观看| 亚洲男人天堂手机在线| 久久久久国产精品免费网站| 中文欧美日本在线资源| 国产欧美在线看| 欧美性高潮在线| 欧美主播福利视频| 久久视频在线免费观看| 久久精品影视伊人网| 精品国产一区二区三区久久狼5月| 国产精品久久久久福利| 亚洲色图欧美制服丝袜另类第一页| 按摩亚洲人久久| 欧美日韩一区二区精品| 中国china体内裑精亚洲片| 国产aaa精品| 九九视频这里只有精品| 日韩av成人在线| 日韩av电影中文字幕| 久久免费精品视频| 成人有码视频在线播放| 中文字幕亚洲一区| 欧洲日本亚洲国产区| 日韩少妇与小伙激情| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美做受高潮电影o| 国产亚洲精品美女久久久久| 亚洲最大的成人网| 国产91色在线| 日韩av成人在线观看| 91免费的视频在线播放| 日本精品久久中文字幕佐佐木| 这里只有精品丝袜| 91在线精品播放| 欧美不卡视频一区发布| 久久中文久久字幕| 日韩在线激情视频| 中日韩午夜理伦电影免费| 亚洲人a成www在线影院| www国产91| 欧美在线视频播放| 18一19gay欧美视频网站| 91精品国产高清自在线| 日韩欧美一区视频| 亚洲自拍偷拍色片视频| 一区二区av在线| 久久国产精品久久久久久| 亚洲天堂一区二区三区| 国产91色在线| 久久av红桃一区二区小说| 国产精品福利在线观看| 国产精品久久久999| 亚洲精品白浆高清久久久久久| 国产www精品| 亚洲成年网站在线观看| 中文字幕亚洲第一| 久久亚洲欧美日韩精品专区| 国产一区二区香蕉| 人人做人人澡人人爽欧美| 欧美成年人视频网站| 丝袜亚洲另类欧美重口| 黑人巨大精品欧美一区二区三区| 国产日韩一区在线| 在线观看视频亚洲| 国产做受69高潮| 日韩欧美在线视频| 成人激情视频网| 精品国产精品自拍| 亚洲片在线资源| 欧美www视频在线观看| 成人亲热视频网站| 另类专区欧美制服同性| 国产成人综合久久| 亚洲男人av电影| 亚洲男子天堂网| 国产一区二区色| 亚洲自拍偷拍福利| 国产69精品久久久久9| 色哟哟网站入口亚洲精品| 一区二区三区亚洲| 日韩精品极品视频| 国产情人节一区| 亚洲国产精品推荐| 久久九九国产精品怡红院| 精品一区二区三区四区| 亚洲91精品在线| 成人精品一区二区三区电影黑人| 国产精品av在线| 在线免费看av不卡| 久久精品国产v日韩v亚洲| 亚洲日本aⅴ片在线观看香蕉| 91大神福利视频在线|