zoukankan      html  css  js  c++  java
  • iOS笔记055

     

    1、程序启动后的开始动画

    程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息。

    可以使用一个xib来描述界面。并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegate中手动加载这个xib

    // 通过stroyboard启动,跟控制器的view并不会在程序启动完成的时候添加到窗口,属于懒加载范畴

    // 程序启动完成的时候调用

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // Override point for customization after application launch.

        // 创建窗口

        self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];

        

        // 加载storyboard

        UIStoryboard *story = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];

        

        UIViewController *vc = [story instantiateInitialViewController];

        

        self.window.rootViewController = vc;

        

        // 显示窗口

        [self.windowmakeKeyAndVisible];

        

        // 加载欢迎界面

        WelcomView *welcome = [WelcomView welcomView];

        // 设置位置和尺寸

        welcome.frame = self.window.bounds;

        // 插入到最外层

        [self.window addSubview:welcome];

        

        returnYES;

    }

    在xib中如果想给内部子控件添加动画,并且动画和主界面的出现有延迟,需要在以下某个方法中实现。

    // 视图添加到窗口时会调用方法didMoveToWindow 再调用didMoveToSuperview

    - (void)didMoveToWindow

    {

        NSLog(@"%s",__func__);

        

    }

    // 视图添加到窗口时会调用这个方法

    // 将后续控件的动画写道这个方法中

     

    - (void)didMoveToSuperview

    {

        NSLog(@"%s",__func__);

        

    }

    2、LaunchScreen.xib

    这个系统自动生成的xib 文件在应用启动时会自动加载,可以在里面添加一些控件,但是 

    注意:LaunchScreen比LaunchImage优先级高。

    设置LaunchImage需要注意,默认模拟器的尺寸跟启动图片有关系。

    // 加载类的时候调用

    // 当程序一启动的时候就会调用

    + (void)load

    {

        NSLog(@"%s",__func__);

    }

    // 当前类或者他的子类第一次使用的时候才会调用

    + (void)initialize

    {

        NSLog(@"%s",__func__);    

    }

    3、给插件添加自定义的提醒方式

    自定义的分类,想让这个方法弹出加载图片提醒

    #import "UIImage+SLQImage.h"

     

    @implementation UIImage (SLQImage)

    // 按照原始图片渲染照片,默认导航条渲染位蓝色

    + (instancetype)imageWithOriImage:(NSString *)imageName

    {

        UIImage *image = [UIImage imageNamed:imageName];

        return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    }

    @end

    把这个方法添加到插件中再次编译运行就可。

    打开插件工程,找到配置文件,是一个plist文件,然后添加需要的条目。

     

    4、给分类添加属性的话,只会生成set和get方法

    #import <UIKit/UIKit.h>

     

    @interface UIView (SLQFrame)

    // 分类里面不能生成成员属性

    // 会自动生成getset方法和成员属性

     

    // @property如果在分类里面只会生成get,set方法的声明,并不会生成成员属性。

    @property (nonatomic, assign) CGFloat height;

    @property (nonatomic, assign) CGFloat width;

    @property (nonatomic, assign) CGFloat x;

    @property (nonatomic, assign) CGFloat y;

     

    @end

    5、如何抛出异常

     NSInteger count = items.count; // 按钮个数

    // 判断列数是不是3的倍数,如果不是就抛出异常

    if(count % 3)

    {

       // 跑出异常

        NSException *excep = [NSException exceptionWithName:@"列数有误" reason:@"列数不是3的倍数" userInfo:nil];

        [excep raise];// 抛出异常 

    }

    // 运行结果

    //  *** Terminating app due to uncaught exception '列数有误', reason: '列数不是3的倍数'

     

    6、自定义tabBar

    默认barBar显示的图片高度不能超过44,如果大于44显示出问题,这是可以自定义tabBar。
     
    6.1、新建一个类SLQTabBar,因为tabBar的个数不确定,所以需要外界传入,这里使用模型数组来设置。

    //  模仿下UITabBar 

    // UITabBar里面的按钮由UITabBarController的子控制器

    @interface SLQTabBar : UIView

    // 模型数组(UITabBarItem),直接使用系统的模型即可

    @property (nonatomic, strong) NSArray *items;

    @end

    6.2、模型数组只需在初始化时添加一次即可,所以使用懒加载方式. 

    @interfaceSLQTabBar ()

    @property (nonatomic, weak) SLQTabBarButton *selected; // 按钮是否选中

     

    @end

     

    - (void)setItems:(NSArray *)items

    {

        _items = items;

        

        // UITabBarItem保存按钮上的图片,按次序添加

        for (UITabBarItem * bar in items) {

            

            // 使用自定义的button,取消高亮状态

            UIButton *btn = [SLQTabBarButtonbuttonWithType:UIButtonTypeCustom];

            // 设置标签

            btn.tag = self.subviews.count;

            // 设置背景

            [btn setBackgroundImage:bar.imageforState:UIControlStateNormal];

            [btn setBackgroundImage:bar.selectedImageforState:UIControlStateSelected];

            // 添加按钮按下响应事件

            [btn addTarget:selfaction:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];

           

            [self addSubview:btn];

            

            if (self.subviews.count == 1) {

                // 默认选中第一个

                [self btnClick:btn];

            }

        }

    }

     6.3、tabBar上是一排按钮排列而成,不过没有高亮状态,只有Normal和selected状态。

     这个只需要重写 UIButton 的一个方法即可。新建一个继承自UIButton的类,重写 setHighlighted 方法

    #import "SLQTabBarButton.h"

    @implementation SLQTabBarButton

    // 取消按钮高亮状态

    - (void)setHighlighted:(BOOL)highlighted

    {}

    @end 

     6. 4、每次添加过按钮之后都要对按钮进行布局

    - (void)layoutSubviews

    {

        [superlayoutSubviews];

        

        int count = (int)self.subviews.count;

        // 按照屏幕宽度计算按钮宽度

        for (int i = 0 ;  i < count;  i ++) {

            CGFloat x = 0;

            CGFloat y = 0;

            CGFloat w = [UIScreenmainScreen].bounds.size.width / count;

            CGFloat h = self.bounds.size.height;

            

            SLQTabBarButton *btn = self.subviews[i];

            

            x = i * w;

            btn.frame = CGRectMake(x, y, w, h);

        } 

    }

    6.5、响应按钮点击的话,使用代理传递数据

    定义

    @classSLQTabBar;

     

    // 添加代理,响应按钮点击

    @protocol SLQTabBarDelegate <NSObject>

     

    @optional

     

    - (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger ) index;

    @end

    声明

    @property (nonatomic, weak) id<SLQTabBarDelegate> delegate;

    使用

    - (void)btnClick:(UIButton *)btn

    {

        // 取消选中上一个按钮

        _selected.selected = NO;

        // 选中当前按钮

        btn.selected  = YES;

        // 记录选中的按钮

        _selected = btn;

        

        // 切换控制器,添加一个代理,先判断是否有这个方法

        if ([self.delegate respondsToSelector:@selector(tabBar:didClickButton:)])

        {

            // 发送消息到代理,通过按钮tag判断是哪一个按钮

            [self.delegate tabBar:self didClickButton:btn.tag];

        }

    }

    6.6、具体使用方法,在控制器中设置tabBar

    添加自定义的tabBartabBar,然后将系统生成的按钮删除.

    //添加自定义的tabBartabBar,然后将系统生成的按钮删除

    - (void)setAllTabBar

    {

        // 移除所有子控件

    //    [self.tabBar removeFromSuperview];

        

        // 添加自定义tabBar

        SLQTabBar *bar = [[SLQTabBar alloc] init];

        // 传入模型数据

        bar.items = self.items;

        // 设置尺寸

        bar.frame = self.tabBar.bounds;

        // 设置代理,监听按钮点击

        bar.delegate = self;

        // 添加到tabBar,但是要把系统自带的按钮删除

        [self.tabBar addSubview:bar];

     

    }

    移除系统按钮

    - (void)viewWillAppear:(BOOL)animated

    {

        [super viewWillAppear:animated];

        

        // 删除系统自带的tabBar

        for (UIView *childView in self.tabBar.subviews) {

            if (![childView isKindOfClass:[SLQTabBar class]]) {

                [childView removeFromSuperview];

            }

        }

    }

    监听按钮点击

    - (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger)index

    {

    //    NSLog(@"%s--%d",__func__,index);

        // 切换控制器

        self.selectedIndex = index;

    }

    7、手动添加pch文件都项目

    pch文件中包含的东西在项目中每个文件中都可以使用。

    8、load和initialize

    // 当程序一启动的时候就会调用

    + (void)load

    {

    }

    // 当前类或者他的子类第一次使用的时候才会调用

    + (void)initialize

    {}

    9、 给任意弹出的窗口添加遮盖

    这个也比较常见,比如说弹出登陆界面时,程序其他部分都是灰色背景,且不能点击。

    可以给程序添加一个灰色的View,而且要显示在所有界面之前,那么可以使用

    [UIApplication sharedApplication].keyWindow;

     添加到这个窗口上的窗口默认都在最前面。

    自定义一个继承自UIView的类,添加两个方法即可。

    // 屏幕尺寸

    #define SLQScreenBounds [UIScreen mainScreen].bounds

    // 主窗口

    #define SLQKeyWindow [UIApplication sharedApplication].keyWindow

     

    // 显示遮盖

    + (void)show

    {

        // 获取主窗口,添加一个view 到主窗口

        UIView *view = [[SLQCoverView alloc] initWithFrame:SLQScreenBounds];

        view.backgroundColor = [UIColorblackColor];

        view.alpha = 0.4;

        // 添加窗口到主窗口,显示在最上层

       [SLQKeyWindow addSubview:view];

        

    }

    // 隐藏遮盖

    + (void)hide

    {

        // 取出子窗口移除,首先判断是不是SLQCoverView类型的view

        for (UIView *childView in SLQKeyWindow.subviews) {

            if ([childView isKindOfClass:self]) {

                [childView removeFromSuperview];

            }

        }

    }

    10、loadView、viewDidLoad和viewDidUnLoad

    loadView 苹果设计这个方法就是给我们自定义UIViewController的view用的

    viewDidLoad 在创建过控制器的view后,向view中添加其他控件

    viewDidUnLoad  系统发出内存警告时

    关系

    1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view

    2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化

    3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法

    4.当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view

    5.view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化

     View的生命周期

    11、UINavigationBar 所生成的图片都是经过处理的view,为蓝色

    屏幕快照 2015 06 30 15 14 26 

    原始图片

      屏幕快照 2015 06 30 15 14 40

    // 默认左右两遍的view都是蓝色的,所以要返回一个原始的图片

    UIImage *image = [UIImageimageNamed:@"CS50_activity_image"] ;

    // 设置图片的渲染方式为原始图片

    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

        

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(activeBtnClick)];

     

  • 相关阅读:
    springcloud费话之配置中心server修改
    springboot的jar包部署
    Address already in use : connect
    关于账户登录鉴权系统的要点
    springcloud费话之配置中心客户端(SVN)
    springcloud费话之配置中心基础(SVN)
    springcloud费话之断路器(hystrix in feign)
    springcloud费话之Eureka接口调用(feign)
    springcloud费话之Eureka服务访问(restTemplate)
    springcloud费话之Eureka集群
  • 原文地址:https://www.cnblogs.com/songliquan/p/4611559.html
Copyright © 2011-2022 走看看