IOS控件之ScrollView,PageControl---APP首次打开引导页面效果实现~

本文详细介绍了如何利用UIScrollView和PageControl创建一个常见的iOS APP首次打开的引导页面效果,包括背景图片展示、滑动页面、‘立即体验’按钮以及小圆点指示器的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

最近学了下UIScrollView的用法,然后自己实现了一个常见的APP首次打开的引导页面效果,效果图如下:
这里写图片描述
这里写图片描述
这里写图片描述
主要就是一个滑动页面的效果,在最后一页上有一个立即体验的按钮,点击按钮会跳转到APP主页面。
主要用到的就是ScrollView,PageControl这两种控件。

实现思路:

把主页面的根视图设置成一个ImageView,用来显示背景图片,然后再在背景图片上面放置一个ScrollView,用来显示滑动的前景图片,因为一共有4张图片,所以向ScrollView中添加4个ImageView,依次放置这4张图片,最后在最后一个ImageView上放置一个“立即体验”按钮。

这些都做完了之后,发现少了一个我们经常会见到的页面正下方的小圆点,显示总页数和当前为第几页。这就是PageControl,我们最后在根视图上创建一个pageControl,显示页面滑动到哪一页了,这里需要注意的是,PageControl要添加到根视图上,而不是ScrollView上,因为如果添加到ScrollView要设置相对位置,当页面滑动时候,显示的是不同的相对位置里面的内容,所以如果要每一页显示不同的内容,就把父视图设置为ScrollView,如果是每一页都要显示的内容,比如PageControl,就不要设置父视图为ScrollView,其实想想很简单,ScrollView是要滑动的嘛。不是固定的。

OK,添加完了所有控件之后,就要添加事件响应了,同ActionSheet一样,ScrollView也无法添加消息响应,只能设置代理,所以只要实现一个代理方法让ScrollView页面翻动时下面的小圆点PageControl也跟着动~~

主要代码如下:

我把步骤简简单单分为4步~很容易就搞定!

Step1:》》》设置根视图为一个显示背景的ImageView:
-(void)loadView{
    [super loadView];
//    要设置背景图片,创建一个rootImageView作为父视图
    [self createRootImageView];
}
#pragma mark 创建rootImageView
-(void)createRootImageView{
    UIImageView *rootImageView=[[UIImageView alloc] initWithFrame:self.view.bounds];
    [rootImageView setImage:[UIImage imageNamed:@"new_feature_background.png"]];
    [self.view addSubview:rootImageView];
//    因为父视图是一个imageView,要开启互动,否则无法做任何操作
//    默认是NO
    [self.view setUserInteractionEnabled:YES];
}
Step2》》》创建显示滑动页面的ScrollView和最后一页的“立即体验”按钮,并添加按钮消息响应
#pragma mark 创建第二层视图scrollView
-(void)createScrollView{
    UIScrollView *scrollView=[[UIScrollView alloc]initWithFrame:self.view.bounds];
//    设置scrollView内容大小--可滑动范围
    [scrollView setContentSize:CGSizeMake(self.view.bounds.size.width*kImageCount, 0)];
//    向其中添加pageImageView
    CGFloat width=self.view.bounds.size.width;
    CGFloat height=self.view.bounds.size.height;
    for (NSInteger i=0; i<kImageCount; i++) {
//        相对于scrollView内容的位置
        UIImageView *pageImageView=[[UIImageView alloc] initWithFrame:CGRectMake(i*width, 0, width, height)];
        [pageImageView setImage:[UIImage imageNamed:[NSString stringWithFormat:@"new_feature_%ld.png",i + 1]]];
        if (i==kImageCount - 1) {
            [self createIntoButton:pageImageView];
        }
        [scrollView addSubview:pageImageView];
    }
//    设置分页,否则滚动效果很糟糕
    [scrollView setPagingEnabled:YES];
//    去掉弹性
    [scrollView setBounces:NO];
//    去掉滚动条
    [scrollView setShowsHorizontalScrollIndicator:NO];
    [scrollView setShowsVerticalScrollIndicator:NO];
//    scrollView目前为第二层视图
    [self.view addSubview:scrollView];
}
#pragma mark 创建最后一页的“立即体验”按钮
-(void)createIntoButton:(UIImageView*)pageImageView{
//    开启父视图交互
    [pageImageView setUserInteractionEnabled:YES];
    UIButton *intoButton=[[UIButton alloc] init];
//    设置背景图片
    UIImage *backImage=[UIImage imageNamed:@"new_feature_finish_button.png"];
    UIImage *backImageHL=[UIImage imageNamed:@"new_feature_finish_button_highlighted.png"];
    [intoButton setBackgroundImage:backImage forState:UIControlStateNormal];
    [intoButton setBackgroundImage:backImageHL forState:UIControlStateHighlighted];
//    设置中心点和大小,大小根据背景
    CGFloat centerX=pageImageView.bounds.size.width/2;
    CGFloat centerY=pageImageView.bounds.size.height * kIntoButtonRatio;
    CGFloat width=backImage.size.width;
    CGFloat height=backImage.size.height;
    [intoButton setBounds:CGRectMake(0, 0, width, height)];
    [intoButton setCenter:CGPointMake(centerX, centerY)];
//    消息响应
    [intoButton addTarget:self action:@selector(intoButtonClick) forControlEvents:UIControlEventTouchUpInside];
//    添加到pageImageView
    [pageImageView addSubview:intoButton];

}
#pragma mark "立即体验"按钮消息响应
-(void)intoButtonClick{
    SubViewController *subView=[[SubViewController alloc] init];
    [self presentViewController:subView animated:YES completion:nil];
}
Step3》》》创建PageControl并添加到父视图
#pragma mark 创建和scrollView同为第二层视图的pageControl
-(void)createPageControl{

    _pageControl=[[UIPageControl alloc] init];
//    设置位置
    [_pageControl setCenter:CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height * kPageControlRatio)];
    [_pageControl setBounds:CGRectMake(0, 0, 150, 44)];
//    设置页数
    [_pageControl setNumberOfPages:kImageCount];
//    设置页面轨道颜色
    [_pageControl setPageIndicatorTintColor:[UIColor grayColor]];
    [_pageControl setCurrentPageIndicatorTintColor:[UIColor orangeColor]];
//    注意,父视图不是ScrollView!
    [self.view addSubview:_pageControl];
}
Step4: 运行!

Oh,No!发现不论到哪一页,PageControl那个小圆点都不变化:这里写图片描述
什么原因?因为没有为ScrollView设置代理,没有实现代理方法。所以ScrollView变化无法影响到PageControl的变化。
所以现在我们在createScrollView方法里面加一行代码:

//    设置代理,以便于滑动时改变pageControl
    [scrollView setDelegate:self];
然后再实现代理方法:
#pragma mark scrollView的代理方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSInteger index=scrollView.contentOffset.x/scrollView.bounds.size.width;
    [_pageControl setCurrentPage:index];
}

一些最后的废话~:

好啦,到目前为止,我们就学会了如何做一个看起来很diao的APP引导页面~
源代码?当然要提供啦!所以我会上传到csdn上,大家免费下载来学习了~
PS:发现一个很让我伤心的事情,就是我坚持写了这么久的博客,可是却没有人评论。。。。没有一点关注度。。。但是。。。尽管如此,我还是会坚持写,练好文笔,相信有一天会成为一个关注度很高的技术博客!
下一篇的内容是:如何实现一个循环显示的ScrollView,我们会使用一个假循环来显示~
代码链接:
http://download.youkuaiyun.com/detail/u012320459/9230433

本Demo使用UICollectionView实现自动无限轮播功能。 主要功能: 1.实现自动轮播,可修改轮播的时间 2.轮播图片可以来自本地,也可来自网络,通过单独的方法进行设置即可。对于加载网络图片时,Demo中使用了YYWebImage,也可自行替换成SDWebImage。 3.重写了和系统UIPageControl一样的功能,可用图片代替PageControl上的点点,也可自定义其颜色以及切换动画。 使用方法:使用方法比较简单。 /** * 加载本地图片Banner */ - (void)setupLocalBannerImageView { NSArray *array = @[@"1.png", @"2.png", @"3.png", @"4.png", @"5.png"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200) locationImageArray:array]; bannerVew.timeInterval = 2.0; [self.view addSubview:bannerVew]; } /** * 加载网络图片Banner */ - (void)setupNetWorkBannerImageView { NSArray *array = @[@"http://i3.download.fd.pchome.net/t_960x600/g1/M00/07/09/oYYBAFMv8q2IQHunACi90oB0OHIAABbUQAAXO4AKL3q706.jpg", @"http://images.weiphone.net/attachments/photo/Day_120308/118871_91f6133116504086ed1b82e0eb951.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/110425215921926a173e0f728e.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/1104241737046031b3a754f783.jpg"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 200) netWorkImageArray:array placeHolderImage:nil]; bannerVew.timeInterval = 2.0; bannerVew.pageControlStyle = FFPageControlStyleMiddle; bannerVew.delegate = self; [self.view addSubview:bannerVew]; } 以上方式即可简单使用,如需自定义PageControl也可继承FFAbstractDotView,做些基本的设置即可。 gitHub下载地址:喜欢的朋友请给个星呗! 欢迎各位一起来讨论,有问题请发邮箱270452746@qq.com或者直接加我QQ:270452746进行讨论。谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值