UI基础之—UIScrollView,UIPageControl

1.  UIScrollview是 iOS 中提供滚动的控件,用于解决当内容区域大小大于可视区域大小时,可以通过滚动的方式查看全部内容, UIScrollView 滑动视图的基类, UITableView 和 UITextView 是它的子类,内部实现原理是修饰视图的 bounds

2.   UIScrollview 主要专长于两个方面:

滚动: contentSize 大于 frame.size 的时候,能够滚动

缩放:自带缩放,可以指定缩放倍数

bounds 影响的是子视图在父视图上的位置

3.   1⃣创建scrollView 的对象

UISrollView *scroll = [[UISrollViewalloc]initWithFrame:CGRectMake(20,30,280,500)];

2⃣配置属性

scroll.backgroundColor = [UIColorredColor];

3⃣设置内容大小

scroll.contentSize =CGSizeMake(560,1000);

4⃣设置相框对象并添加到 scrollView 上

UIImageView *imageView = [UIImageViewalloc]

initWithFrame:CGRectMake(0,0,scroll.contentSize.width,

scroll.contentSize.height);

[scroll addSubview:imageView];

5⃣添加图片

imageView.image = [UIImage imageNamed:@”Pic.jpg”];

6⃣设置内容区域的偏移量,默认的偏移量为(0,0)

scroll.contentOffset = CGPointMake(0,0);

7⃣设置水平位置的滚动条是否显示

scroll.showsHorizontalScrollIndicator =NO; 默认YES显示         

设置垂直位置的滚动条是否显示

scroll.showsVerticalScrollIndicator = NO;

8⃣设置滚动条的格式

scroll.indicatorStyle =UIScrollViewIndicatorStyleWhite;

9⃣设置是否能够滚动

scroll.scorllEnabled = YES;  默认为 YES

4.  1⃣方向锁(设置滑动的时候只能在一个方向滑动)

scroll.direationLockEnabled = YES;

2⃣设置 scrollView 的整屏滑动,一次滑动 scrollView 的大小

scroll.pagingEnabled = NO;

3⃣设置滑动到边界的是否有回弹的效果

scroll.bounces = YES; YES 是没有反弹效果, NO 是由反弹效果

4⃣  设置内容大小小于视图大小的时候,依然有边缘反弹效果 scroll.alwaysBounceHorizontal =YES;

scroll.alwaysBounceVertical = YES;

5⃣  设置滑动到顶部(点击状态条的时候)设置点击状态 栏,

scrollview是否能够回到顶部

scroll.scrollsToTop = YES;

5.  1⃣设置缩放的比例

scroll.minimumZoomScale = 1.0;

scroll.maximumZoomScale = 4.0;

 2⃣  设置代理中的属性

scroll.delegate = self;

首先在创建的UIScrollView对象中设置代理对象

接着,在需要设置代理的类中添加UIScrollViewDelegate协议,并实现需要是实现的方法,用来控制UIScrollView的操作. 

6. UIScrollViewDelegate 协议中的关于UIScrollView 的方法:

① 当在scrollView上滑动的时候触发,会触发很多次

-(void)scrollViewDidScroll:(UIScrollView *)scrollView;

② scrollView 将要开始拖拽的时候触发(手指刚刚触摸到 scrollView 的时候)

     -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

③ scrollView将要结束拖拽的时候触发

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView  

withVelocity:(CGPoint)velocity targetContentOffset:(inout

CGPoint *)targetContentOffset;

④ scorllView 已经结束拖拽的时候触发

     -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView

     willDecelerate:(BOOL)decelerate;

⑤ scrollView 开始减速的时候触发(必须要有加速的过程才能触发,该方法不一定会被触发)

-(void)scrollViewWillBeginDecelerating: (UIScrollView *)

scrollView;

⑥ scrollView 结束减速时触发(停止时)该方法也不一定会被触发

-(void)scrollViewDidEndDecelerating: (UIScrollView *)scrollView{

//当 scrollView 停止滑动时,回到最初的位置

scrollView.contentOffset = CGPointMake(0,0);

//不加动画效果回到最初的位置,特别生硬,带动画视图会慢慢移动

[scrollView setContentOffset:CGPointZero animated:YES];

}

⑦ scrollView结束滑动并且带有动画效果时触发(必须带有动画)

-(void)scrollViewDidEndScrollingAnimation: (UIScrollView *)

scrollView;

⑧ 回到顶部的操作:

当点击状态栏时,调用该方法,询问点击状态栏的scrollview 是否可以回到顶部(前提是:scrollToTop = YES)

-(BOOL)scrollViewShouldScrollToTop: (UIScrollView *)scrollView;

scrollView 已经回到顶部时触发(此时可以做刷新)

-(void)scrollViewDidScrollToTop: (UIScrollView *)scrollView;

⑨ 下面的四个方法,是对 scrollView进行扩充和缩放的时候触发的:

-(void)scrollViewDidZoom: (UIScrollView *)scrollView; 只要进行缩放,就会触发.

指定某个 UIScrollView 的子视图可以被放大缩小,返回值只能是 scrollView 上的子视图.

-(UIIView *)viewForZoomingInScrollView: (UIScrollView *)

scrollView{

return [scrollView viewWithTag:100];

}

将要开始缩放的时候触发:

-(void)scrollViewWillBeginZooming: (UIScrollView *)scrollView withView:(UIView *)view;

完成放大缩小的时候触发:

-(void)scrollViewDidEndZooming: (UIScrollView *)scrollView withView:(UIView *)view atScale: (CGFloat)scale{

// 重置为原来的大小

[scrollView setZoomScale:1.0 animated:YES];

}

#import "RootViewController.h"
@interface RootViewController ()<UIScrollViewDelegate>
@end
@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //UIScrollView 是 iOS 中提供滚动的控件,用于解决当内容区域大小大于可视区域大小时,可以通过滚动的方式查看全部内容, UIScrollView 滑动视图的基类. UITableView 和 UITextView 是他的子类,内部实现原理是修饰视图的 bounds
    /*
     UIScrollview主要专长于两个方面:
     滚动: contentSize 大于 frame.size 的时候,能够滚动
     缩放:自带缩放,可以指定缩放倍数
     bounds影响的是子视图在父视图上的位置
     */
    // 1.创建 scrollView的对象
    UIScrollView *scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(20, 30, 280,500)];
     // 2.配置属性
    scroll.backgroundColor = [UIColor redColor];
    // 2.1设置内容大小
    scroll.contentSize =CGSizeMake(280, 500);
     // 2.2设置图片
    UIImageView *imageView =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, scroll.contentSize.width, scroll.contentSize.height)];
    imageView.tag = 100;
    // 2.3添加图片
    imageView.image = [UIImage imageNamed:@"Pic.jpg"];
    // 2.4设置内容区域的偏移量,默认的偏移量为(0,0)
    scroll.contentOffset = CGPointMake(0, 0);
    // 2.5设置水平位置的滚动条是否显示
    scroll.showsHorizontalScrollIndicator = NO;  //默认为 YES显示
    // 2.6设置垂直方向滚动条的显隐
    scroll.showsVerticalScrollIndicator = NO;  // 默认为 YES 显示
    // 2.7设置滚动条的格式
    scroll.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    // 2.8设置是否能够滚动
    scroll.scrollEnabled = YES;// 默认是 YES
    // 2.9方向锁(设置滑动的时候只能在一个方向滑动)
    scroll.directionalLockEnabled = YES;
    // 2.10设置 ScrollView的整屏滑动,一次滑动 scrollView 的大小
    scroll.pagingEnabled = NO;
    // 2.11设置滑动到边界的是否有回弹效果
    scroll.bounces = YES;// YES 是没有反弹效果, NO 是由反弹效果
    // 2.12设置内容大小小于视图大小的时候,依然有边缘反弹效果
    scroll.alwaysBounceHorizontal = YES;
    scroll.alwaysBounceVertical = YES;
    // 2.13设置滑动到顶部(点击状态条的时候)设置点击状态栏, scrollview 是否能够回到顶部
    scroll.scrollsToTop = YES;
    // 2.12设置代理属性
    scroll.delegate = self;
    // 2.13设置缩放比例
    scroll.minimumZoomScale = 1.0;
    scroll.maximumZoomScale = 4.0;
    // 3.向 scroll 添加一个 UIImageVIew
    [scroll addSubview:imageView];
    [imageView release];
    [self.view addSubview:scroll];
    // 4.释放
    [scroll release];
    
   }
#pragma mark ------------协议中的方法------------------
//触发时机: scrollView 在滑动的时候触发,会触发很多次
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
// 触发时机:只要缩放,就会触发
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
// 触发时机: scrollView 将要开始拖拽的时候触发(手指刚刚触摸到 scrollView 的时候)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
//NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
// 触发时机: scrollView 将要结束拖拽的时候被触发
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
//NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
// 触发时机: scrollView 已经结束拖拽的时候触发
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  //NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
// 触发时机: scrollView 开始减速的时候触发(必须有加速的过程才能触发,该方法不一定会被触发)
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
  //NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
//触发时机 scrollView结束减速时触发(停止时)该方法也不一定会被触发
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
//NSLog(@"%s %d",__FUNCTION__,__LINE__);
    // 当 scorllView 停止滑动时,回到最初的位置
    //scrollView.contentOffset = CGPointMake(0, 0);
    // 不加动画效果会最初位置特别生硬,带动画效果视图会慢慢移动
    //[scrollView setContentOffset:CGPointZero animated:YES];
}
// 触发时机: scrollView 结束滑动并且带有动画效果时触发(必须要有动画)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
}

// 触发时机:指定某个 UIScrollView 的子视图可以被放大缩小.返回值只能是 scrollView 上的子视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    NSLog(@"%s %d",__FUNCTION__,__LINE__);
    return [scrollView viewWithTag:100];  // 返回缩放的 imageView
}
//触发时机:将要开始缩放的时候触发
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
//触发时机:完成放大缩小的时候触发
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
    [scrollView setZoomScale:1.0 animated:YES];
};

// 触发时机:点击状态栏时,调用该方法,询问点击状态栏的 scrollView 是否可以回到顶部(前提是: scrollToTop = YES)
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
   // NSLog(@"%s %d",__FUNCTION__,__LINE__);
    return YES;
}
// 触发时机:scrollView 已经回到顶部时触发(此时可以做刷新用)
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
}
- (void)didReceiveMemoryWarning {
   // [super didReceiveMemoryWarning];
}
@end

6.  自定义协议和系统协议的使用流程:

1⃣自定义协议和代理  例如:DeleagateViewDelegate

1> 定义协议,(协议中的方法都是代理要做的任务)

2> 定义代理属性(存放从别的文件中传入的代理对象, id类型,服从协议,属性的属性 assign,实例变量名称一般为delegate)

3> 在其他文件中指定代理对象(找谁去干活)

4> 让代理对象类遵循协议(答应去干活)

5> 代理对象类实现协议中的方法(知道怎么去干活)

6> 委托人通知代理去执行协议中的方法(知道什么时候去干活)

2⃣系统类 代理和协议的使用流程

1> 在其他文件中指定协议对象(找谁去干活)

2> 让代理对象类遵循协议

3> 代理对象类实现协议的方法

二    UIPageControl 和 UILable 相似是iOS 中提供的分页控件,用来标识页数,可以通过点击 pageControl 切换分页,继承自 UIControl,通常跟 UIScrollView 配合使用.

(下面有配合使用编写的程序启动引导图程序)

1⃣创建一个UIPageControl 对象

UIPageControl *pageControl = [[UIPageControl alloc]

initWithFrame:CGRectMake(10,100,300,40)];

2⃣配置属性

设置总页数 pageControl.numberOfPages = 5;

设置颜色 pageControl.backgroundColor = [UIColor redColor];

配置当前页的颜色

pageControl.currentPageIndicatorTintColor = [UIColor greenColor];

配置其他分页的颜色

pageControl.pageIndicatorTintColor = [UIColor blueColor];

默认显示分页

pageControl.currentPage = 2;

3⃣为UIPageControl 添加单击事件

[pageControl addTarget:self action:@selector(pageControl:)forControlEvents: UIControlEventValueChanged];

实现方法:

 - (void) pageControl: (UIPageControl*)sender{

// 打印当前的页面

NSLog(@”%@”,sender.currenPage);

}

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
      // UIPageControl 和 UILable 相似  是 iOS 中提供的分页控件,用来标识页数,可以通过点击 pageControl 切换分页,继承自 UIControl
      // 用于指示当前第几页(代码)
     // 通常与 UIScrollView 配合使用
    
    //self.view.backgroundColor = [UIColor blackColor];
    
    UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(10, 100, 300, 40)];
    // 配置属性
    // 设置总页数
    pageControl.numberOfPages = 5;
    // 设置颜色
    pageControl.backgroundColor = [UIColor redColor];
    // 配置当前页的颜色
    pageControl.currentPageIndicatorTintColor = [UIColor greenColor];
    // 配置其他分页的颜色
    pageControl.pageIndicatorTintColor = [UIColor blueColor];
    // 默认显示分页
    pageControl.currentPage = 2;
    [pageControl addTarget:self action:@selector(pageControl:) forControlEvents:UIControlEventValueChanged];
     [self.view addSubview:pageControl];
    [pageControl release];
}

#pragma mark ----------实现方法----------
- (void)pageControl:(UIPageControl *) sender{
    NSLog(@"%ld",sender.currentPage);
    NSLog(@"打印当前页");

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

8.懒加载(LazyLoading)

  实现懒加载的步骤:

    1⃣写属性

    2⃣重写 get 方法,并且在内部进行判断,如果没有创建,再对其进行创建

    3⃣注意:使用懒加载技术,以后在使用的时候必须加上(self.)

    4⃣懒加载的好处

     1>当使用对象的时候,才对其进行创建,有效的节省内存

     2>通过懒加载可以实现分段代码分段

懒加载的使用:

1>定义一个视图控制器

#import "LanchpadViewController.h"
#import "RootViewController.h"
#define kScreenWidth  [[UIScreen mainScreen] bounds].size.width
#define kScreenHeight [[UIScreen mainScreen] bounds].size.height
#define kImageCount 6
@interface LanchpadViewController ()<UIScrollViewDelegate>
@property (nonatomic,retain) UIScrollView *scorllView;
@property (nonatomic,retain) UIPageControl *pageControl;
@end
@implementation LanchpadViewController
// 懒加载(LazyLoading)
// 实现懒加载的步骤:
/*
 1.写属性
 2.重写 get 方法,并且在内部进行判断,如果没有创建,再对其进行创建
 3.注意:使用懒加载技术,以后在使用的时候必须要加上(self.)
 4.懒加载的好处:
 1>当使用对象的时候,才对其进行创建,有效的节省内存
 2>通过懒加载可以实现代码分段
 */
- (void)dealloc{
    [_scorllView release];
    [_pageControl release];
    [super dealloc];
}
- (UIScrollView *)scorllView{
    if (_scorllView == nil) {
        _scorllView = [[UIScrollView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    }
    return _scorllView;
}
- (UIPageControl *)pageControl{
    if (_pageControl == nil) {
        _pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake((kScreenWidth - 200) /2, kScreenHeight - 50, 200, 40)];
    }
    return _pageControl;
}
// 布局 scrollView
- (void)layoutScrollView{
   // 设置 scrollView 的内容的大小
    self.scorllView.contentSize = CGSizeMake(kScreenWidth *  kImageCount , kScreenHeight);
    // 设置屏幕滚动
    self.scorllView.pagingEnabled = YES;
    self.scorllView.delegate = self;
    self.scorllView.showsHorizontalScrollIndicator = NO;
    [self.view addSubview:self.scorllView];
    // 放置主视图
    for (int i= 0;  i < kImageCount; i++) {
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(kScreenWidth * i, 0, kScreenWidth, kScreenHeight)];
        NSString *imageName = [NSString stringWithFormat:@"v6_guide_%d", i + 1];
        imageView.image = [UIImage imageNamed:imageName];
        [self.scorllView addSubview:imageView];
        [imageView release];
        if (i == kImageCount - 1) {
            UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
            // 将 UIImageView 的交互打开
            imageView.userInteractionEnabled = YES;
            [imageView addGestureRecognizer:tapGR];
            [tapGR release];
        }
    }
}

// 实现手势的方法
- (void)handleTap:(UITapGestureRecognizer *)sende{
    // 1.当点击最后一张图片时,意味着用户引导界面启动结束,这是需要存储用户的操作信息
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    
    [user setBool:YES forKey:@"r"];
    [user synchronize];  // 立即同步用户信息,就是执行了存储操作
    
    // 2.进入程序主界面
    RootViewController *rootVC = [[RootViewController alloc]init];
    // 获取我们当前的主程序(应用程序)
    [UIApplication sharedApplication]. keyWindow.rootViewController = rootVC;
    // 释放
    [rootVC release];
    
}
// 布局 pageControl
- (void)layoutPageControl{
    // 添加到父视图
    [self.view addSubview:self.pageControl];
    self.pageControl.numberOfPages = kImageCount;
    self.pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
    self.pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    [self.pageControl addTarget:self action:@selector(handlePage:) forControlEvents:UIControlEventValueChanged];
}
// 实现方法
- (void)handlePage:(UIPageControl *)sender{
    [self.scorllView setContentOffset:CGPointMake((kScreenWidth * sender.currentPage), 0)  animated:YES];
}
#pragma mark ----------实现协议中的方法------------
// 滑动结束的时候触发
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    // 获取 scrollView 的偏移量
    NSInteger index = scrollView.contentOffset.x / kScreenWidth;
    self.pageControl.currentPage = index;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self layoutScrollView];
    [self layoutPageControl];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

2>在 AppDelegate.m文件中,设置引导图的启动(判断用户是否是第一次运行程序,如果是第一次运行程序,就启动引导图,如果不是第一次启动程序,就直接进入程序主界面)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    // 根据判断程序运行时是否需要启动引导图
    // 用户索引项,用户的一些偏好设置
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    
    if ( ![user boolForKey:@"r"]) {
        // 一旦发现返回值为 NO, 说明是第一次,之前没有存储过@"龙庆",则将用户引导界面作为我们 window 的根视图界面
        LanchpadViewController *lanchPad = [[LanchpadViewController alloc]init];
        self.window.rootViewController = lanchPad;
        [lanchPad release];
    }else{
        // 一旦发现为 YES, 说明不是第一次启动程序,,之前启动过,这个时候将 PageViewController 设定为我们 window 的跟视图控制器
        RootViewController *rootVC = [[RootViewController alloc]init];
        self.window.rootViewController = rootVC;
        [rootVC release];
    }
    return YES;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值