tableView位置的动态改变

原创 2015年09月08日 17:13:42

#import "DetailViewController.h"

@interface DetailViewController ()<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate>
{
    BOOL _isShowImageView; //背景图片是否显示(即tableView是否滑到顶部)
    BOOL _isMoveWithContentSize; //是否根据contentSize的改变来移动tableView
    BOOL _isDownInertia;   //是否有向下的惯性
    CGRect _startFrame; //初始tableView的y值是300
    CGRect _endFrame;   //结束tbaleView的y值是0
    /**
     *  初始contentSize的y值
     */
    CGFloat _orientation;
}
@end

@implementation DetailViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _isShowImageView = YES;
    // Do any additional setup after loading the view from its nib.
}

-(void)viewDidAppear:(BOOL)animated{
    _startFrame = self.tableview.frame;
    _endFrame = _startFrame;
    _endFrame.origin.y = 60;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *myCell = @"myCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:myCell];
    }
    cell.textLabel.text = @"测试";
    cell.detailTextLabel.text = @"测试数据";
    return cell;
}

#pragma mark UITableViewDelegate
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 2;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return @"标题";
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 80;
}

#pragma mark UIScrollViewDelegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (scrollView.frame.origin.y == 0) {
        _isShowImageView = NO;
    }else if (scrollView.frame.origin.y == 300){
        _isShowImageView = YES;
    }
    CGRect tempRect = scrollView.frame;
    if (_isShowImageView) {
        //向上滑还是向下滑
        if (scrollView.contentOffset.y > _orientation) {
            _isMoveWithContentSize = YES;
        }else{
            //只要tableView的位置在0-300之间就跟着contentSize滑动
            if (scrollView.frame.origin.y < 0 || scrollView.frame.origin.y > 300) {
                _isMoveWithContentSize = NO;
            }
        }
    }else{
        if (scrollView.contentOffset.y > _orientation || scrollView.contentOffset.y > 0) {
            if (scrollView.frame.origin.y < 0 || scrollView.frame.origin.y > 300) {
                _isMoveWithContentSize = NO;
            }
        }else{
                _isMoveWithContentSize = YES;
        }
    }
    if (_isDownInertia) {
        _isMoveWithContentSize = NO;
    }
    //根据contentSize的改变来改变scollView的frame,同时将contentSize置为0(感觉滑动整个scrollView)
    if (_isMoveWithContentSize) {
        tempRect.origin.y = scrollView.frame.origin.y - scrollView.contentOffset.y;
        scrollView.frame = tempRect;
        scrollView.contentOffset = CGPointMake(0, 0);
    }
}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    _isDownInertia = NO;
    _orientation = scrollView.contentOffset.y;
}

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    //velocity:(惯性)速度,有正负,可以判断向上向下滑动
    NSLog(@"~~~~~~%@",NSStringFromCGPoint(velocity));
    NSLog(@"---%@ +++%@",NSStringFromCGPoint(scrollView.contentOffset),NSStringFromCGPoint(*targetContentOffset));
    if (!_isShowImageView && velocity.y < 0) {
        _isDownInertia = YES;
    }
    if (_isShowImageView && velocity.y > 0) {
        //防止惯性滑动
        *targetContentOffset = scrollView.contentOffset;
    }
    __block CGRect rect = scrollView.frame;
    [UIView transitionWithView:scrollView duration:0.2 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        if (_isShowImageView) {
            if (scrollView.frame.origin.y < _startFrame.origin.y * 0.9) {
                //tableView移动到顶部
                rect.origin.y = 0.0;
                scrollView.frame = rect;
            }else{
                //tableView回到原位置(即显示背景图片的位置)
                rect.origin.y = _startFrame.origin.y;
                scrollView.frame = rect;
            }
        }else{
            if (scrollView.frame.origin.y < _startFrame.origin.y * 0.1) {
                //tableView移动到顶部
                rect.origin.y = 0.0;
                scrollView.frame = rect;
            }else{
                //tableView回到原位置(即显示背景图片的位置)
                rect.origin.y = _startFrame.origin.y;
                scrollView.frame = rect;
            }
        }
    } completion:nil];
}



@end

动态改变对话框大小和位置

  • 2013年07月03日 19:20
  • 1.8MB
  • 下载

android:自定义layout动态改变view位置和大小

android:自定义layout动态改变view位置和大小   (2012-03-12 10:42:20) 转载▼ 标签:  自定义   学习心得  ...

view随着屏幕旋,动态改变其位置

  • 2014年07月26日 20:06
  • 2.55MB
  • 下载

随着手指滑动动态改变子控件位置、透明度、大小的实现方式

这里把布局文件和核心类代码贴出来,大家一起交流探讨! 为了省事,没加自定义属性,代码中写死了,在此只是提供一些思路。 package com.blemobi.demo.widg...

mfc动态改变对话框窗口大小和显示位置

void CMainFrame::OnChangeSize() { // TODO: Add your command handler code here CRect cr; GetClien...

关于iphone 上touch事件动态改变元素位置时与touch点发生偏移的问题

touchstart, touchmove, touchend 关于iphone 上touch事件动态改变元素位置时与touch点发生偏移的问题,iphone兼容,...

iOS 评论界面 监听键盘高度 动态改变输入框位置

#pragma mark - 监听键盘高度 -(void)viewWillAppear:(BOOL)animated {     [self registerForKeyboardNotificati...
  • HeXin_
  • HeXin_
  • 2015年01月24日 11:46
  • 790

cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置

先看一下UIListView添加、插入、删除的机制,再来考虑如何互换两项的位置。 UIListView.h /* 所有项用一个数组来保存 */ CCArray* _items; void ListVi...

关于使用属性动画来动态改变控件的布局位置

属性动画大家用的都很多了,这里就直接重点说一下自己所用到的知识,希望对你们有点用 本文主要说的是关于如何在代码中用属性动画去动态更改控件在布局中的位置 因为我们的项目不能用xml,而且有的控件是不间...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tableView位置的动态改变
举报原因:
原因补充:

(最多只允许输入30个字)