iOS多控制器实现带滑动动画第1/2页

本文实例为大家分享了iOS多控制器实现带滑动动画的具体代码,供大家参考,具体内容如下

主控制器 ,管理控制器 .h文件

//宏
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height

#import "MYMainViewController.h"
#import "MYFirstViewController.h"
#import "MYSecondViewController.h"
#import "MYThirdViewController.h"

@interface MYMainViewController ()<UIScrollViewDelegate>
//控制器名
@property (nonatomic, strong) NSArray *VcNames;
//选择栏
@property(nonatomic, strong) UIView *clickBar;
//底部容器scrollView
@property (strong, nonatomic) UIScrollView *containerScrollerView;

@end

. m 文件

底部scrollView , 用于滑动

@implementation MYMainViewController

- (UIScrollView *)containerScrollerView
{
  if (!_containerScrollerView) {
    _containerScrollerView = [[UIScrollView alloc]init];
    _containerScrollerView.pagingEnabled = YES;
    _containerScrollerView.showsVerticalScrollIndicator = NO;
    _containerScrollerView.showsHorizontalScrollIndicator = NO;
    _containerScrollerView.contentSize = CGSizeMake(kScreenWidth *self.VcNames.count,kScreenHeight);
    _containerScrollerView.backgroundColor = [UIColor whiteColor];
    _containerScrollerView.delegate = self;
  }
  return _containerScrollerView;
}

初始化顶部选择栏

//三个子控制器
- (NSArray *)VcNames
{
  if (!_VcNames) {
    _VcNames = @[@"控制器一",@"控制器二",@"控制器三"];
  }
  return _VcNames;
}

//点击选择栏
- (UIView *)clickBar
{
  if (!_clickBar) {
    _clickBar = [[UIView alloc]init];
    _clickBar.backgroundColor = [UIColor lightGrayColor];

    CGFloat width = kScreenWidth / 3;
    CGFloat height = 44;
    //初始化按钮
    for (NSInteger index = 0; index < 3; index++) {

      UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
      [button setTitle:self.VcNames[index] forState:UIControlStateNormal];
      [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
      button.frame = (CGRect){width *index,0,width,height};
      [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];

      //绑定tag值
      button.tag = index;
      [_clickBar addSubview:button];
    }
  }
  return _clickBar;
}

viewDidLoad

- (void)viewDidLoad {
  [super viewDidLoad];

  self.edgesForExtendedLayout = 0;
  //初始化选择栏
  [self initClickBar];

  //初始化底部scrollView容器
  [self initScrollViewContainer];

  //初始化子控制器
  [self addChildControllers];

}

添加子控制器 , 初始化UI

//按钮选择栏
- (void)initClickBar
{
  [self.view addSubview:self.clickBar];
  self.clickBar.frame = (CGRect){0,0,[UIScreen mainScreen].bounds.size.width,44};
}

//初始化滑动容器
- (void)initScrollViewContainer
{
  [self.view addSubview:self.containerScrollerView];
  self.containerScrollerView.frame = CGRectMake(0,44,kScreenWidth, kScreenHeight );
}

//添加子控制器
- (void)addChildControllers
{
  //为了方便直观 , 在此处设置背景色 (实际开发中,不能在这里设置 , 原因是这里只要调用到了控制器的view属性 , 该控制器将会执行viewDidLoad方法 , 相当于直接一开始就将三个控制器的所有UI和网络请求全加载完了 , 负荷会相当重)
  MYFirstViewController *firstVc = [[MYFirstViewController alloc]init];
  firstVc.view.backgroundColor = [UIColor redColor];
  [self addChildViewController:firstVc];

  MYSecondViewController *secondVc = [[MYSecondViewController alloc]init];
  secondVc.view.backgroundColor = [UIColor blueColor];
  [self addChildViewController:secondVc];

  MYThirdViewController *thirdVc = [[MYThirdViewController alloc]init];
  thirdVc.view.backgroundColor = [UIColor yellowColor];
  [self addChildViewController:thirdVc];

  //默认展示第一个子控制器
  [self scrollViewDidEndDecelerating:self.containerScrollerView];
}

按钮点击事件实现 , 代理方法实现

//选择栏按钮点击事件
- (void)buttonClick:(UIButton *)button
{
  [self.containerScrollerView setContentOffset:CGPointMake(button.tag *kScreenWidth, 0) animated:YES];
}

//滑动减速时调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  //获取contentOffset
  CGPoint currentOffset = scrollView.contentOffset;

  NSInteger page = currentOffset.x / kScreenWidth;

  //取出对应控制器
  UIViewController *viewController = self.childViewControllers;

  //添加到scrollView容器
  //  if (![viewController isViewLoaded]) {

  [self.containerScrollerView addSubview:viewController.view];
  viewController.view.frame = CGRectMake(page *kScreenWidth, 0,kScreenWidth, kScreenHeight);
  //  }

}

目录

效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS左右滑动标签页导航的设计

    iOS中左右滑动切换,滑动标签页导航的设计思路,具体内容如下 iOS开发中经常(几乎每个APP都含有这样的页面吧,几乎!UI设计师也都是这样抄来抄去-..) demo见Github:SliderTab 估计很多人都会说,直接用第三方就可以了,很多人封装过,很好用.而且这样的页面用第三方2分钟搞定,省时省力. 笔者也曾用过第三方,但是屡屡出bug.而且不好修改.所以只能自己写,bug少,代码通俗易懂,童叟无欺. 这里介绍一个第三方DLSlideView,Github地址:DLSlideView,目

  • 微信浏览器弹出框滑动时页面跟着滑动的实现代码(兼容Android和IOS端)

    在做微信开发的时候遇到这个问题:微信浏览器弹出框滑动时页面跟着滑动. 我觉得这个问题用的是下面这几行代码: var $body = $('body'), dialogIsInView = !1,//当前是不是对话框 lastContentContainerScrollTop = -1,//用于弹出框禁止内容滚动 $contentContainer = $('#content-container');//内容容器 //阻止Window滚动 function stopWindowScroll() {

  • IOS仿今日头条滑动导航栏

    之前在我们平台给大家分享了网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问题,以及上面导航栏的便宜量. 2.网易首页导航封装类优化中主要解决iOS7以上滑动返回功能中UIScreenEdgePanGestureRecognizer与ScrollView的滑动的手势冲突问题. 今天仿今日头条滑动导航和网易首页导航封装类优化相似,这个也是解决手势冲突,UIPanG

  • iOS实现双向滑动条效果

    最近做项目,碰到一种双向滑动条,自己实现了一下,随便写一下思路,方便以后开发,避免重复写代码,以后粘贴就行了.封装了一下,代码如下: #import <UIKit/UIKit.h> typedef NSString* (^HLDoubleSlideViewSwitchStrBock)(CGFloat count); @interface HLDoubleSlideView : UIView @property(nonatomic,assign)CGFloat maxValue; @proper

  • iOS使用pageViewController实现多视图滑动切换

    本文实例为大家分享了pageViewController实现多视图(控制器)滑动切换的具体代码,供大家参考,具体内容如下 先看一下效果动画 类似的界面做过不少,在几个APP中都有用到过,再次之前不了解uipageViewController 曾经的思路有两个现在想想都觉得繁琐. 之前的思路1:使用嵌套,collectionview嵌套,每个item中添加内容 之前的思路2:使用scrollview 在上面创建一个一个的controller 实现左右滑动 这两个思路无疑是可以实现的,并且可以实现每

  • UIPageViewController实现的左右滑动界面

    本文实例为大家分享了UIPageViewController实现左右滑动界面展示的具体代码,供大家参考,具体内容如下 .h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end .m #import "ViewController.h" #import "SubPage1ViewController.h" #import "SubPage2ViewCo

  • iOS滑动解锁、滑动获取验证码效果的实现代码

    最近短信服务商要求公司的app在获取短信验证码时加上校验码,目前比较流行的是采用类似滑动解锁的方式,我们公司采取的就是这种方式,设计图如下所示: 这里校验内部的处理逻辑不作介绍,主要分享一下界面效果的实现, 下面贴出代码: 先子类化UISlider #import <UIKit/UIKit.h> #define SliderWidth 240 #define SliderHeight 40 #define SliderLabelTextColor [UIColor colorWithRed:1

  • ios scrollview嵌套tableview同向滑动的示例

    我讨论的问题是嵌套同向滑动,能避免尽量避免.最好用一个tableview实现.一个tableview不够用了再嵌套,适用复杂场景. 首先我说下不适用的,免得大家浪费时间. 1.不适用上下拉刷新加载更多的页面. 2.不适用点击cell获取点击事件的页面,可以加入button点击获取事件. 官方文档说尽量不要进行两个竖直或两个水平方向滑动的视图嵌套.因为这个时候机器不知道用户要让哪个滑动,但在我们这个神奇的国度,项目中经常出现这样的需求,产品经理总爱这样做,andriod那边是比较容易实现的,ios

  • IOS开发向右滑动返回前一个页面功能(demo)

    在ios7中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键(iphone5的这种返回被吐糟为反人类设计).然而现在android的手机市场上几乎很难找到小于4寸屏的手机了,几乎所有的应用都是通过点击左上角的返回来退到上一个页面,如果单手拿一个大屏手机,我是觉得会发疯.为此花了点时间写了个向右滑动返回的demo. 效果如下图: 此图为点击第一个Activity跳转到第二个Activity后,向右滑动再返回到第一个Activit

  • IOS开发中禁止NavigationController的向右滑动返回

    IOS开发中禁止NavigationController的向右滑动返回 大家在进行开法的时候细心的朋友会发现,.用后在屏幕的最左边,向右滑动,,你会发现,你的App返回到了上一个页面,这是怎么回事呢, 在你的App中输入UINavigationController ,然后按住commend键,点击鼠标,跳进去,如下图: 在UINavigationController 的属性中你会发现 红色下划线部分,你看到了UINavigationController 自带的有一个panGeesture,所以,

随机推荐