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. CentOS 磁盘阵列(raid10)

    1.通过mdadm命令进行磁盘阵列部署 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具 如果没有mdadm命令,通过yum安装一下 ...

  2. CentOS 文件特殊权限SUID,SGID,SBIT

    1.SUID ,是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效). (1)SUID权限仅对二进制程序有效: (2)本权限仅在执行该 ...

  3. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  4. BZOJ2738:矩阵乘法——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2738 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数 ...

  5. BZOJ1208:[HNOI2004]宠物收养所——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1208 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物 ...

  6. 关于Javac编译器的那点事(一)

    Javac是什么? 它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码.而Java字节码,说白了就是一连串二进制数字. J ...

  7. [codeforces/edu30]总结(E)

    链接:http://codeforces.com/contest/873/ A题: 贪心,把最大的k个数变成x即可. B题: 从左向右枚举右端点,维护balance的最长长度.任意一个子串可以看做两个 ...

  8. 单线程的redis为什么达到每秒万级的处理速度?

    纯内存访问,redis将所有数据都放在内存中,内存响应时间大约为100纳秒,这是redis达到每秒万级级别访问的重要基础. 非阻塞IO,redis使用epoll作为IO多路复用技术的实现,再加上red ...

  9. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  10. 汕头市队赛SRM 20 T1魔法弹

    T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...