模仿AppStore首页拖拽效果

2015-08-14  本文已影响0人  hj的简书
2015-08-14 20_58_54.gif

效果代码分析

Snip20150814_1.png

目大多是应用在拥有导航控制器下)

@interface HJScrollView : UIView
// 添加一个images属性,让控制器控制HJScrollView显示内容
@property (nonatomic, strong) NSArray *images;
@end
 - (void)setImages:(NSArray *)images
{
    _images = images;
    // 获取屏幕宽度
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat heigth = self.frame.size.height;
    NSUInteger count = images.count;
    for (int i = 0; i < images.count; i++) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(width * i, 0, width, heigth)];
        imageView.image = [UIImage imageNamed:images[i]];
        [self.scrollView addSubview:imageView];
    }
    // 允许分页
    self.scrollView.pagingEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(count * width, 0);
}
    // 自定义的scrollview高度(150是头部视图高度)
    const CGFloat kScrollHeigth = 150;

    @interface ViewController () <UITableViewDelegate, UITableViewDataSource>

    /** 纪录最原始的偏移量 */
    @property (nonatomic, assign) CGFloat orginalOffsetY;

    @property (weak, nonatomic) IBOutlet HJScrollView *scrollView;
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollTopCons;

    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self setUpScrollView];
        
        // tableview相对于原点的偏移量 = 为视图高度+导航栏高度(64为导航控制器高度)
        self.orginalOffsetY = - (kScrollHeigth + 64);
        
        // 使用内边距将tableView默认top设置在HJScrollView下
        self.tableView.contentInset = UIEdgeInsetsMake(kScrollHeigth + 64, 0, 0, 0);
        
        // 取消ios7以后为scrollview添加的额外滚动区域
        self.automaticallyAdjustsScrollViewInsets = NO;
        
        // 设置tableview的代理
        self.tableView.delegate = self;
        
        // 设置tableview数据源代理
        self.tableView.dataSource = self;
    }

    // 初始化scrollview数据
    - (void)setUpScrollView
    {
        NSArray *arrays = @[@"ad_00", @"ad_01", @"ad_02", @"ad_03", @"ad_04"];
        self.scrollView.images = arrays;
    }
 -  (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        // 获取当前的偏移量
        CGFloat currentOffsetY = scrollView.contentOffset.y;
        
        // 获取滑动的偏移量和原始偏移量之差
        CGFloat delta = currentOffsetY - self.orginalOffsetY;
        
        // 如果已经滑动到原始位置,当手指向下滑动时,保持头部视图不变
        if (delta <= 0) {
            delta = 0;
        }
        
        // 当手纸向上滑动时,让视图的头部约束为负数,这样就可以将头部视图往上推
        self.scrollTopCons.constant = -delta;
    }

参考文档及代码分享

上一篇 下一篇

猜你喜欢

热点阅读