1.简介

代码

延续前一个博客使用Xib来创建view,本文我们创建一个带有PageControlView的ScrollView的table的headView,如下图:

具有自动滚动:

具有拖拽完毕后,自动滚动继续效果:

2.实现

本文中将在TableView的headView中增减一个scrollView和PageControl两个控件来展示你的热点商品信息。

同样的我们还是使用xib来包装这个局部。

1.按照如下新建xib文件,并设置Custom Class 为之后创建的自定义View类。

在这个xib设计中,两个View设定高度为1,作为两条分隔横线来使用。

需要特别注意的是:ScrollerView与PageControl一定要有一定要按照如图所示先定义ScrollView然后在定义PageControlView这样在实际云顶的时候ScrollView才不会覆盖掉PageControlView。在使用代码创建的时候也应该这种顺序进行addsubview操作。

2.定义完后需要定义xib对应的View class文件:

XFHeadView.h

#import <UIKit/UIKit.h>

@interface XFHeadView : UIView

// 需要显示的所有图片信息
@property (nonatomic, strong) NSArray *pictsList;

// 类创建方法
+(instancetype) headViewInit;
@end

XFHeadView.m

//
//  XFHeadView.m
//  How to create groupBuy page
//
//  Created by apple on 15/12/17.
//  Copyright © 2015年 apple. All rights reserved.
//

#import "XFHeadView.h"

@interface XFHeadView()<UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollerView;
@property (weak, nonatomic) IBOutlet UIPageControl *indexView;

// 计算使用变量
@property(nonatomic,assign) CGSize scrollViewSize;

// 自动滚动timer
@property(nonatomic, strong) NSTimer *timer;

@end

@implementation XFHeadView
+(instancetype) headViewInit;
{
    // 从xib文件中加载 view
    XFHeadView * headView = [[[NSBundle mainBundle] loadNibNamed:@"XFHeadView" owner:nil options:nil]lastObject];

    // 设定尺寸的计算变量
    headView.scrollViewSize = headView.scrollerView.bounds.size;

    // 设定scrollerView的代理为当前view对象
    headView.scrollerView.delegate = headView;

    // 设定一些固定的控件配置
    // 禁止纵向滚动
    headView.scrollerView.showsHorizontalScrollIndicator = NO;

    // 分页显示
    headView.scrollerView.pagingEnabled = YES;

    // 返回
    return headView;
}

-(void)addAutoNextPageTimer
{
    // 如果已有timer在运行则将其停止销毁
    if  (self.timer != nil && self.timer.isValid)
    {
        [self.timer invalidate];
        self.timer = nil;
    }

    // 新建timer
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
    self.timer = timer;

    // 将此timer加入到主loop中去,并设定NSRunLoopCommonModes,防止在主loop中阻塞
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:timer forMode: NSRunLoopCommonModes];
}

/**
 *  滚动到下一页
 */
-(void)nextPage
{
    // 设定pageControl,在这里不这是pageControl变量的值,这个值到代理方法中计算
    NSInteger page = self.indexView.currentPage;
    ) {
        page = ;
    }
    else{
        page++;
    }

    /**
     *  根据当前页码来控制scroll的off位置,去显示正确的图片
     */
    CGFloat offsetX = page * self.scrollerView.frame.size.width;

    [UIView animateWithDuration:1.0 animations:^{
        self.scrollerView.contentOffset = CGPointMake(offsetX, );
    }];
}

/**
 *  设定图片信息
 *
 *  @param pictsList pictsList description
 */
-(void) setPictsList:(NSArray *)pictsList
{
    _pictsList = pictsList;

    // 设定UIPageControl
    self.indexView.numberOfPages = pictsList.count;
    self.indexView.currentPage = ;

    // 首先需要将将scrollView上所有字view,也就是全部图片清除
    [self.scrollerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    // 设定需要加载的图片
    ; i < pictsList.count; i++)
    {
        // 创建图片空间
        UIImageView *imageView = [[UIImageView alloc] init];
        [self.scrollerView addSubview:imageView];

        // 设定图片
        NSString *imageName = pictsList[i];
        imageView.image = [UIImage imageNamed:imageName];

        // 设定在scrollView中每一张图的排版
        CGFloat x  = i * self.scrollViewSize.width;
        imageView.frame = CGRectMake(x, , self.scrollViewSize.width, self.scrollViewSize.height);
    }

    // 设置滚动空间的滚动范围,只有横向滚动,无纵向滚动
    self.scrollerView.contentSize = CGSizeMake(pictsList.count * self.scrollViewSize.width, );

    // 开始自动滚动
    [self addAutoNextPageTimer];
}

#pragma mark --scrollView的代理方法

// 正在滚动
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 计算pageControl的值
    ) / self.scrollerView.frame.size.width;
    self.indexView.currentPage = page;
}

// 当点住scrollView不让图片自动滚动的时候停止自动化timer
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.timer invalidate];
    self.timer = nil;
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self addAutoNextPageTimer];
}

@end

3.代码说明:

ScrollView拥有代理属性,将代理设置为本类:

    // 设定scrollerView的代理为当前view对象
    headView.scrollerView.delegate = headView;

4.使用自定义View

在controller中只要简单的将此View创建并赋值给headView属性即可:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    XFHeadView *headView = [XFHeadView headViewInit];

    headView.pictsList = @[@"headimage_01", @"headimage_02", @"headimage_03", @"headimage_04"];

    self.goodsTableView.tableHeaderView = headView;
。。。。
。。。。
}

3.总结

ScrollView空间关键点在于设置内部图片的位置,你可以将ScrollView想象成一个潜水镜,在发生scrol的时候其实是scrollView这个潜水镜在移动,而内部内容并没有移动。

[How to] UIScrollView的使用方法的更多相关文章

  1. UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置

    一个UICollectionView有好多个cell,滑动一下,谁也不知道会停留在哪个cell,滑的快一点,就会多滑一段距离,反之则会滑的比较近,这正是UIScrollview用户体验好的地方. 如果 ...

  2. 【UIScrollView】基本方法+基本描述

    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )]; scrollView.backgroundColor = [ ...

  3. 关于UIScrollView属性和方法的总结

    iOS中UIScollView的总结 在iOS开发中可以说UIScollView是所有滑动类视图的基础,包括UITableView,UIWebView,UICollectionView等等,UIScr ...

  4. 关于UIScrollView属性跟方法的总结

    iOS中UIScollView的总结 在iOS开发中可以说UIScollView是所有滑动类视图的基础,包括UITableView,UIWebView,UICollectionView等等,UIScr ...

  5. [转]IOS 学习笔记(8) 滚动视图(UIScrollView)的使用方法

    下面介绍pageControl结合ScrollView实现连续滑动翻页的效果,ScrollView我们在应用开发中经常用到,以g这种翻页效果还是很好看的,如下图所示: 通过这个例子,我们重点学习UIS ...

  6. IOS UIScrollView常用代理方法

    iOS UIScrollView代理方法有很多,从头文件中找出来学习一下 //只要滚动了就会触发 - (void)scrollViewDidScroll:(UIScrollView *)scrollV ...

  7. UIScrollView 的代理方法简单注解

    //减速停止了时执行,手触摸时执行执行 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;    //只要滚动了就会触发 ...

  8. ios滚动UIScrollView的setContentOffset方法

    在UIScrollView,setContentOffset方法的功能是跳转到你指定内容的坐标,[self.scroview setContentOffset:CGPointMake(0, 50) a ...

  9. UIScrollView的代理方法(delegate)

    // ViewController.m // 05-UIScrollView的代理(delegate) #import "ViewController.h" @interface ...

随机推荐

  1. 【刷题】BZOJ 5154 [Tjoi2014]匹配

    Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...

  2. bzoj1588 [HNOI2002]营业额统计 (treap)

    平衡树裸题 只需要求前驱后驱 treap写法 const mm=<<; maxnumber=; maxn=; var left,right,fix,key:..maxn]of longin ...

  3. [bzoj] 2657 ZJOI2012 旅游 || bfs

    原题 题意: 一个多边形,三角剖分,求一条对角线最多能经过多少三角形 题解: 因为不涉及坐标之类的,所以根几何肯定一点关系都没有. 我们会发现,对于有共边的两个三角形,可以被同一条线穿过,而这就相当于 ...

  4. UVA.11300 Spreading the Wealth (思维题 中位数模型)

    UVA.11300 Spreading the Wealth (思维题) 题意分析 现给出n个人,每个人手中有a[i]个数的金币,每个人能给其左右相邻的人金币,现在要求你安排传递金币的方案,使得每个人 ...

  5. 通过反射获取T.class代码片段

    说明 持久化框架MyBatis和Hibernate中我们多多少少都会自己取写工具类!但是我们一般都会处理结果集转换成持久化对象,但是我们都要使用类! 代码片段 abstract public clas ...

  6. You can't specify target table 'table' for update in FROM clause

    delete from table1 where ID not in(select max(ID) ID from table1 group by row1) and row1 ) # 出现错误 # ...

  7. UVA 580 Critical Mass

    https://vjudge.net/problem/UVA-580 题意:一堆U和L,用n个排成一排,问至少有3个U放在一起的方案数 f[i] 表示 至少有3个U放在一起的方案数 g[i] 表示没有 ...

  8. 2015/8/10 Python基本使用(1)

    此文为<Python核心编程>的读书笔记记录. Python是一门解释性语言,所有的语句用解释器(interpreter)来直接解释,但它同时是High Level的语言,这样的组成能够在 ...

  9. c# “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

    症状描述如下: 如果将一个委托作为函数指针从托管代码封送到非托管代码,并且在对该委托进行垃圾回收后对该函数指针发出了一个回调,则将激活 callbackOnCollectedDelegate 托管调试 ...

  10. spoj104 highways 生成树计数(矩阵树定理)

    https://blog.csdn.net/zhaoruixiang1111/article/details/79185927 为了学一个矩阵树定理 从行列式开始学(就当提前学线代了.. 论文生成树的 ...