iOS开发小功能自学之二:分页(进行封装处理)

主要用Xib方式,代码后期还会有进一步的优化

下次用代码的时候一定要复制一份再用,直接拿出源代码来不小心哪里碰了下,耽误了10多分钟去找bug,郁闷!!!

功能:类似于手机打开新浪网首页最上面的大图片,自动滚动,右下角有个页数显示。

思路和注意点:1、主要用到的是scrollView和page control

2、在Xib中布置好控件

3、封装三部曲(首先在自定义构造方法内添加子控件,其次在layoutSubview中添加子控件的尺寸(此方法有随着外部尺寸变化,子控件尺寸比例随

          着变化的动能),最后重写setter方法,拿到模型数据)

4、其它细节的设置如:翻页动画,page control小点的颜色变化,单页时候page control自动隐藏等等

使用的主要方法:1、加载Xib的方法:loadNibNamed

2、封装子控件的三步:- (instancetype)initWithFrame:(CGRect)frame{}

- (void)layoutSubviews{}

                     - (void)setImageNames:(NSArray *)imageNames{}

代码实现:

ZWpageView.h中:

 1 #import <UIKit/UIKit.h>
 2 @interface ZWpageView : UIView <UIScrollViewDelegate>
 3
 4 + (instancetype)pageView;
 5 /** 图片数据 */
 6 @property (strong, nonatomic)NSArray *imageNames;
 7 /** 其它圆点颜色 */
 8 @property (strong, nonatomic)UIColor *otherColor;
 9 /** 当前圆点颜色 */
10 @property (strong, nonatomic)UIColor *currentColor;
11
12 @end

ZWpageView.m中

#import "ZWpageView.h"
@interface ZWpageView()

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
/** 定时器 */
@property (strong, nonatomic)NSTimer *timer;

@end
@implementation ZWpageView

#pragma mark - 初始化方法
+ (instancetype)pageView{
    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}
// 当xib\storyboard创建时,会调用这个方法来初始化控件
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}

/**
 * 当xib\storyboard创建完毕时,会调用这个方法来初始化控件
 * 当xib\storyboard创建完毕后的初始化操作,应该在这里面进行
 */
- (void)awakeFromNib
{
    [self setup];
}
- (void)setup
{
    self.scrollView.backgroundColor = [UIColor blueColor];
    //开启定时器
    [self startTimer];

}

- (void)layoutSubviews{
    [super layoutSubviews];
    //设置scrollView的frame
    self.scrollView.frame = self.bounds;

    CGFloat imageW = self.scrollView.frame.size.width;
    CGFloat imageH = self.scrollView.frame.size.height;
    //设置pageControl
    CGFloat pageW = 100;
    CGFloat pageH = 37;
    self.pageControl.frame = CGRectMake(imageW - pageW, imageH - pageH, pageW, pageH);
    //单页时候pageControl自动隐藏
//    self.pageControl.hidesForSinglePage = YES;   //xib中可以直接勾上!!!

    self.scrollView.contentSize = CGSizeMake(self.imageNames.count * imageW, 0);

    for (int i=0; i<self.scrollView.subviews.count; i++) {
        UIImageView *imageView = self.scrollView.subviews[i];
        imageView.frame = CGRectMake(i * imageW, 0, imageW,imageH);
    }
}
#pragma mark - 代理

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    self.pageControl.currentPage = (int)(self.scrollView.contentOffset.x / self.scrollView.frame.size.width + 0.5);
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self stopTimer];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self startTimer];
}

#pragma mark - 定时器控制

- (void)startTimer
{
    //创建定时器
    //    NSTimer *timer = [NSTimer timerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
    //    [timer fire];         //这个方法不行,执行一次后就释放,不会保存
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.1 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
}
- (void)stopTimer
{
    [self.timer invalidate];
    self.timer = nil;
}

- (void)nextPage
{
    NSInteger page = self.pageControl.currentPage + 1;
    if (page == self.pageControl.numberOfPages) {
        page = 0;
    }
    CGPoint offset = self.scrollView.contentOffset;
    offset.x = page * self.scrollView.frame.size.width;
    [self.scrollView setContentOffset:offset animated:YES];//跳转到你所指定内容的坐标,YES表示跳转有动画
}

#pragma mark - set方法重写

- (void)setImageNames:(NSArray *)imageNames{
    _imageNames = imageNames;
    //由于可能用到多次set方法,所以重写set方法时候应该删除点之前的set方法内的内容(不要for循环删子控件)
    [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    //取出图片放入到scrollView中
    for (int i = 0; i<imageNames.count; i++) {
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.image = [UIImage imageNamed:imageNames[i]];
        [self.scrollView addSubview:imageView];
    }
    //小的细节设置
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.pagingEnabled = YES;
    self.pageControl.numberOfPages = imageNames.count;
}

- (void)setOtherColor:(UIColor *)otherColor{
    _otherColor = otherColor;
    self.pageControl.pageIndicatorTintColor = otherColor;
}
- (void)setCurrentColor:(UIColor *)currentColor{
    _currentColor = currentColor;
    self.pageControl.currentPageIndicatorTintColor = currentColor;
}
@end

学习自:小码哥

时间: 2024-10-09 10:02:22

iOS开发小功能自学之二:分页(进行封装处理)的相关文章

【Swift】iOS开发小坑历险记(二)

前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 1.用动画更新约束没有动画效果? 缺少 layoutIfNeeded ,事例: UIView.animateWithDuration(0.15, animations: { () -> Void in self.heightConst

自学iOS开发小功能之六:UIApplication

一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplication sharedApplication]可以获得这个单例对象. (4) 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个. (5

自学iOS开发小功能之五:代理设计模式以及书写规范

一.基本概念 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 代理设计模式:我们买电饭锅之类的,不会亲自到厂家去买,而是在商超等地方购买,而商超就是厂家的代理 应用场合:1.对象B想监听对象A的行为,让对象B成为对象A的代理   2.对象A

iOS开发小功能的自学思路(弹出生日键盘为例)

1 #import "ViewController.h" 2 3 @interface ViewController () <UITextFieldDelegate> 4 @property (weak, nonatomic) IBOutlet UITextField *birthdayLabel; 5 @property (strong, nonatomic)UIDatePicker *datePicker; 6 7 @end 8 9 @implementation Vi

自学iOS开发小功能之三:弹框的两种方式(iOS8.3之后新的方式,之前的已经弃用)

1.弹框出现在屏幕中间位置 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否退出" preferredStyle: UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActio

iOS开发小功能之九:五句代码搞定简单的父子控制器

小码哥大神的代码,确实精简! 1.最终结果如下面三个图,点击one,two,three,分别出现3个不同的控制器 直接代码:(三个控制器的创建就上了) #import "ViewController.h" #import "ZWOneViewController.h" #import "ZWTwoViewController.h" #import "ZWThreeViewController.h" @interface Vie

iOS开发小功能之十一:线程间的通信(3种方式)

三种方法都是通过touchesBegin监听屏幕的触摸实现 一.performSelector方式 1 #import "ViewController.h" 2 @interface ViewController () 3 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 4 @end 5 @implementation ViewController 6 - (void)touchesBegan:(NSSet<

iOS开发小功能之八:手势的简单使用(6种)以及代理方法

代码: 1 #import "ViewController.h" 2 @interface ViewController () <UIGestureRecognizerDelegate> 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 5 @end 7 @implementation ViewController 8 - (void)viewDidLoad { 9 [super viewDidLo

ios开发小知识2

http://blog.sina.com.cn/s/blog_66450b500102vadq.html http://www.cnblogs.com/lovesmile/archive/2012/06/27/2565569.html ios开发小知识2(转自cc) 退回输入键盘  - (BOOL)textFieldShouldReturn:(id)textField{    [textField resignFirstResponder];} CGRectCGRect frame = CGRe