ios scrollview 내장 tableview 같은 방향 으로 미 끄 러 지 는 예제

12825 단어 scrollowwebview
내 가 토론 한 문 제 는 같은 방향 으로 미 끄 러 지 는 것 이 므 로 가능 한 한 피 할 수 있다.table view 로 구현 하 는 것 이 좋 습 니 다.tableview 가 부족 하면 다시 끼 워 넣 고 복잡 한 장면 에 적용 합 니 다.
우선 여러분 이 시간 을 낭비 하지 않도록 적용 되 지 않 는 것 을 말씀 드 리 겠 습 니 다.
1.더 많은 페이지 를 불 러 오 는 데 위아래 로 새로 고침 이 적용 되 지 않 습 니 다.
2.cell 을 클릭 하여 이벤트 페이지 를 가 져 오 는 것 은 적용 되 지 않 으 며,button 을 클릭 하여 이 벤트 를 가 져 올 수 있 습 니 다.
공식 문 서 는 가능 한 한 두 개의 세로 또는 두 개의 수평 방향 으로 미 끄 러 지 는 보 기 를 끼 워 넣 지 말 라 고 한다.이 럴 때 기 계 는 사용자 가 어느 것 을 미 끄 러 뜨 려 야 할 지 모 르 지만 우리 의 신기 한 나라 에서 프로젝트 에 이런 수요 가 자주 발생 합 니 다.제품 매니저 는 항상 이렇게 하 는 것 을 좋아 합 니 다.앤 드 리 오 드 쪽 은 비교적 쉽게 실현 할 수 있 습 니 다.ios 쪽 은 매우 복잡 합 니 다.저 는 하루 동안 연 구 를 했 습 니 다.demo 를 써 서 겨우 실현 할 수 있 습 니 다.제 프로젝트 에 위아래 가 있 기 때문에 저 는 딱딱 하 게 끼 워 넣 었 습 니 다.사용자 가 미 끄 러 질 때 자신의 뜻 대로 scrollview,tableview 를 정확하게 미 끄 러 뜨 릴 수 없습니다.이렇게 되 었 습 니 다.이것 은 해결 방안 이 없습니다.
내 가 한 효 과 는 손 으로 점 을 찍 은 보기 에 있 는 보 기 를 굴 리 는 것 이다.작은 스크롤 이 자신의 임계값 으로 굴 러 가면 큰 스크롤 을 굴 리 고 큰 것 도 임계값 에 이 르 면 굴 리 지 않 는 다.가짜 부유 secView 를 실현 하 였 습 니 다.나머지 는 페이지 에 따라 프레임 을 조정 하면 통용 된다.
이것 은 효과 도 입 니 다.

다음은 상기 두 가지 적용 되 지 않 는 페이지 에서 의 실현 방향 을 말씀 드 리 겠 습 니 다.
Scrollview 는 컨트롤 러 의 view 에 있 습 니 다.큰 보기 입 니 다.tablewview 는 Scrollview 에 있 습 니 다.드래그 제스처 의 배합 에 따라 먼저 터치 점 이 어느 view 에 있 는 지 판단 한 다음 에 어떤 view 에 미 끄 러 지 는 지 판단 합 니 다.제스처 와 button 클릭 의 충돌 을 해결 합 니 다.다음은 코드 를 보고 주석 이 매우 뚜렷 하 다.github 데모 있 습 니 다.
핵심 코드 는 다음 과 같 습 니 다.

#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);
}

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기