ios scrollview 내장 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);
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Tauri 애플리케이션에서 기본 모양과 느낌을 만들기 위한 8가지 팁저는 최근에 Tauri에서 만든 Markdown 중심의 데스크톱 검색 앱인 을 출시했습니다. Tauri로 만든 앱은 당연히 네이티브 앱입니다. 그러나 UI 부분은 WebView에서 실행되므로 모양과 느낌이 웹 앱과 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.