UISegmentedControl 分段器加载不同的viewcontroller

#import <UIKit/UIKit.h>

@interface MJSegmentViewController : UIViewController
/**
 *  @brief   设置切换不同viewcontroller
 *
 *  @param arrViewCtl 保存viewController对象
 *  @param arrTitle   分段器的标题
 */
- (void)loadSetViewController :(NSArray *)arrViewCtl andSegementTitle :(NSArray *)arrTitle;

@end

#import "MJSegmentViewController.h"

@interface MJSegmentViewController ()

/**
 *  @brief 分段器选中加载对应的viewcontroller
 *
 */
@property(nonatomic,assign) UIViewController *selectedViewController;
/**
 *  @brief  用来标识分段器选中的索引
 *
 */
@property(nonatomic, assign) NSInteger selectedViewCtlWithIndex;

/**
 *  @brief 声明UISegmentedControl 分段器
 */
@property(nonatomic,strong) UISegmentedControl *segmentControl;
@end

@implementation MJSegmentViewController

#pragma mark - lifeCircle
- (void)viewDidLoad
{
    [super viewDidLoad];

    [self createSegement];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

}

#pragma mark - private
/**
 *  @brief 创建分段器
 *
 */
- (void)createSegement
{
    if (!_segmentControl)
    {
        _segmentControl = [[UISegmentedControl alloc]init];
        _segmentControl.segmentedControlStyle = UISegmentedControlStyleBar;
        _segmentControl.layer.masksToBounds = YES ;
        _segmentControl.layer.cornerRadius = 3.0;

        _segmentControl.tintColor= [UIColor colorWithRed:0.027
                                                   green:0.060
                                                    blue:0.099
                                                   alpha:0.900];

        [_segmentControl setBackgroundImage:[UIImage imageNamed:@"2"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        self.navigationItem.titleView = _segmentControl;
    }
    else
    {
        [_segmentControl removeAllSegments];
    }
    [_segmentControl addTarget:self
                        action:@selector(selectedSegmentClick:)
                        forControlEvents:UIControlEventValueChanged];

}
- (void)loadSetViewController:(NSArray *)arrViewCtl andSegementTitle:(NSArray *)arrTitle
{
    if ([_segmentControl numberOfSegments] > 0)
    {
        return;
    }
    for (int i = 0; i < [arrViewCtl count]; i++)
    {
        [self pushViewController:arrViewCtl[i] title:arrTitle[i]];
    }
    _segmentControl.frame = CGRectMake(0, 0, 200, 25);
    [_segmentControl setSelectedSegmentIndex:0];
    self.selectedViewCtlWithIndex = 0;

}
- (void)pushViewController:(UIViewController *)viewController title:(NSString *)title
{
    [_segmentControl insertSegmentWithTitle:title atIndex:_segmentControl.numberOfSegments animated:NO];
    [self addChildViewController:viewController];
    [_segmentControl sizeToFit];
}

- (void)setSelectedViewCtlWithIndex:(NSInteger)index
{
    if (!_selectedViewController)
    {
        _selectedViewController = self.childViewControllers[index];
        if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0f)
        {
            CGFloat fTop = 20.0f;
        if (self.navigationController && !self.navigationController.navigationBar.translucent)
            {
                fTop = self.navigationController.navigationBar.frame.size.height;
            }
            CGRect frame = self.view.frame;
            [_selectedViewController view].frame = CGRectMake(frame.origin.x, frame.origin.y - fTop, frame.size.width, frame.size.height);

        }
        else
        {
            [_selectedViewController view].frame = self.view.frame;
        }
        [self.view addSubview:[_selectedViewController view]];
        [_selectedViewController didMoveToParentViewController:self];
    }
    else
    {
        if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0f) {
            [self.childViewControllers[index] view].frame = self.view.frame;
        }
        [self transitionFromViewController:_selectedViewController toViewController:self.childViewControllers[index] duration:0.0f options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished)
         {
            _selectedViewController = self.childViewControllers[index];
            _selectedViewCtlWithIndex = index;
        }];
    }

}

#pragma mark - action
- (void)selectedSegmentClick:(id)sender
{
 self.selectedViewCtlWithIndex = _segmentControl.selectedSegmentIndex;

}

@end
#import <UIKit/UIKit.h>
#import "MJSegmentViewController.h"
@interface MJViewController : MJSegmentViewController

@end
#import "MJViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface MJViewController ()

@end

@implementation MJViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *arr = @[[self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"], [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]];
    NSArray *title = @[@"one",@"two"];
    [self loadSetViewController:arr andSegementTitle:title];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

时间: 2024-08-25 19:06:53

UISegmentedControl 分段器加载不同的viewcontroller的相关文章

自定义类加载器——加载任意指定目录的class文件

public class MyClassLoader extends ClassLoader{ String path;//自定义类加载器所负责的文件夹 public MyClassLoader(String path) { super(); this.path = path; } @SuppressWarnings("deprecation") @Override protected Class<?> findClass(String name) throws Class

JS模块加载器加载原理是怎么样的?

路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的对应原则,加载器才能知道需要加载的 js 的路径.在这个例子里,就是 baseUrl + 'a.js' 和 baseUrl + 'b.js'. 但 id 和 path 的对应关系并不是永远那么简单,比如在 AMD 规范里就可以通过配置 Paths 来给特定的 id 指配 path. 原理二:crea

通过类加载器加载资源文件

/*******************************************第一种方法***************************************************************/ public class Demo {    //资源文件可以通过类加载器的方式加载到内存中,这种方式的好处是程序不用明确制定配置文件的具体所在目录.程序可以自动的在    //src目录下搜索该文件,并加载    //采用下面这种方法还有一种弊端,就是,通过类加载器加载

Unity3D - 图形性能优化:优化着色器加载时间

Unity官方文档之"图形性能优化-优化着色器加载时间"的翻译,E文链接. Optimizing Shader Load Time 优化着色器加载时间 Shaders are small programs that execute on the GPU, and loading them can take some time. Each individual GPU program typically does not take much time to load, but shade

JVM自定义类加载器加载指定classPath下的所有class及jar

一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责JAVA_HOME/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. 2.其他类加载器:由java实现,可以在方法区找到其Class对象.这里又细分为几个加载器 a).扩展类加载器(Extension ClassLoader):负责用于加载JAVA_HOM

0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 2.简单示例 2.1.继承 HandlerInterceptorAdapter 抽象类实现一个拦截器.代码如下: public class DemoInterceptor extends HandlerInterceptorAdapter { @Override    pu

Android进阶:十三、自定义类加载器加载加密类文件

之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等.其实笔者对类加密比较感兴趣,就稍稍调研了一下.类加密的其实是为了防止APP被反编译,防止反编译的方法有很多种,比如混淆,加固等.自己对类文件进行加密,并自定义类加载器也是一种办法: 首先我们的代码打包编译之后会变成难以读懂的二进制字节码,并且变成.class文件.但是简单的APP编译出来之后可以被反编译,甚至你写的

Android进阶:自定义类加载器加载加密类文件

之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等.其实笔者对类加密比较感兴趣,就稍稍调研了一下.类加密的其实是为了防止APP被反编译,防止反编译的方法有很多种,比如混淆,加固等.自己对类文件进行加密,并自定义类加载器也是一种办法: 首先我们的代码打包编译之后会变成难以读懂的二进制字节码,并且变成.class文件.但是简单的APP编译出来之后可以被反编译,甚至你写的

video.js分段自动加载视频【html5视频播放器】

突发奇想的需求,要在官网上放一个一个半小时的视频教程-- 然而,加载成了问题,页面是cshtml的.net混合网站,不知道哪儿的限制,导致视频加不出来. 没有办法,只能前端想办法了. 于是将视频切割成4个 依次加载自动播放.效果还可以. 代码: 引入:<link rel="stylesheet" href="//cdn.bootcss.com/video.js/6.0.0-RC.5/alt/video-js-cdn.min.css"> <scrip