UI需要记忆的东西

UI记忆

1、获取一个点的方法CGPointMake

   view1.center = CGPointMake(50, 50);


2、设置视图圆角

  view1.layer.cornerRadius = 10;

    view1.clipsToBounds = YES

设置背景图片和layer的圆角一致


3、将视图放到顶层

 [self.view bringSubviewToFront:view1];


4、将视图放到底层

[self.view sendSubviewToBack:view1];


5、在父亲View1上,将view3视图插入view2下面

[view1 insertSubview:view3 belowSubview:view2];


6、添加一个轻触手势

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dealTap)];

[photoView addGestureRecognizer:tap];

后面实现一个dealTap方法即可


7、单次动画

 [UIView animateWithDuration:4 delay:0 options:UIViewAnimationOptionAutoreverse animations:^{

        bullet.frame = CGRectMake(3004505050);

        //bullet.alpha = 0;

    } completion:^(BOOL finished) {

        [bullet removeFromSuperview];

    }];


8、文本输入框textField点击键盘的return按键后不会自动退出键盘
解决办法:

使用textField的代理功能

textField.delegate = self;

调用者(当前控件)作为textField的代理;

继承<UITextFieldDelegate>协议;

实现方法:-(BOOL)textFieldShouldReturn:(UITextField *)textField

-(BOOL)textFieldShouldReturn:(UITextField *)textField

{

    //放弃作为第一响应者

    [textField resignFirstResponder];

    return YES;

}

第一响应者如果是可编辑控件,则键盘会自动弹出,如果第一响应者不是可编辑控件,键盘会自动收回。
第一响应者的机制类似栈,栈顶控件即为第一响应者,放弃作为第一响应者的操作应该就是栈弹出当前控件

9、
实现动画的四步骤
1、设置动画持续时间
2、设置动画资源数组
3、设置动画重复次数
4、startAnimating

10、定时器使用
定时器调度方法

   [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(dealLoop:) userInfo:nil repeats:YES];

参数1:定时时间
参数2:传入定时器自己作为参数
参数3:定时溢出执行的方法签名
参数4:nil
参数5:是否重复执行

定时器的好处是异步

11、使用网络图片设置一个imageView的方法

[iconImage setImageWithURL:[NSURL URLWithString:_model.iconUrl]];


12、对于按键上的图片和文字,只能使用set打头的方法对各种状态分别设置。


13、可变数组不能在遍历的同时删除,需要先将需删除的对象放到另一个数组,最后按数组删除

最后证明:应该


14、

给按键添加响应事件

 [_fireButton addTarget:self action:@selector(dealButton:forControlEvents:UIControlEventTouchUpInside];


15、轻触手势   

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(movePlane:)];

    [_plane addGestureRecognizer:pan];


16、判断两个控件是否相交

(CGRectIntersectsRect(A.frame, B.frame)

作用例:飞机大战中判断子弹是否击毁飞机


17、对于可变数组NSMultableArray的遍历删除操作

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

        Bullet *b = _bulletArray[i];

        if(b.isDie)

        {

            [_bulletArray removeObject:b];

            [b removeFromSuperview];

    //最重要的一步:每删除一个元素,其后所有元素下标都会向前偏移一位

            i--;

        }

    }


18、延时执行方法

[self performSelector:@selector(dealDeleteBomb:) withObject:imageView afterDelay:time];

参数1:延时方法;参数2:方法参数;参数3:延时时间

作用实例:飞机大战爆炸效果容器View的删除


19、音乐效果

使用AVFoundation.framework框架

使用方法:

(1)在general标签中添加AVFoundation框架

(2)#import <AVFoundation/AVFoundation.h>

(3)通过bundle获取mp3音频路径

(4)创建播放器

(5)设置重复次数和音量

(6)play方法播放

    //添加背景音乐

    //AVFoundation - game_music.mp3

   NSString *path = [[NSBundle mainBundle]      pathForResource:@"game_music.mp3" ofType:nil];

    _backAudioPlayer = [[AVAudioPlayer allocinitWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];

    _backAudioPlayer.numberOfLoops = -1;

    _backAudioPlayer.volume = 0.3;

    [_backAudioPlayer play];


20、

AppDelegate的第一个方法:

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

在这个方法里设置self.window.rootViewController为哪个ViewController,哪个ViewController就会被第一个加载显示

(优先级大于箭头,突破箭头限制)


21、

从一个控制器A页面跳到控制器B页面方法:

控制器A presentViewController 控制器B

控制器B返回控制器A:

控制器B dismissViewControllerAnimated


22、

控制器之间四种传值方式

以A->B->C->D为例

(1)正向传值(登陆页面后主页面显示帐号信息)

A传值给B,A中直接给B中属性赋值

(2)反向传值(设置好友备注后,前一个界面要收到新备注显示)

B传值给A,

block法:A中实现一个block,《调B前》扔给B的block属性,B在《回A前》拿值触发block,A中执行block完成B向A传值

代理法:B定义协议(方法定义)和代理,B在《回A前》拿值触发代理执行协议方法

    A遵循协议,实现协议方法,A在《调B前》将自己赋值给B代理属性,

在B触发代理事件时A中执行代理方法,完成B向A传值

(3)单例传值(设置版本号)

通过单例方法创建单例对象给所有控制器访问

(4)通知传值(设置主题)

实现一个单例,并通过NSString作为索引;

广播端:

    //发出改变主题的通知

    //获取通知中心对象

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    //参数1: 通知名字任意接受通知对应

    [center postNotificationName:@"ChangeTheme" object:nil userInfo:@{@"color":[UIColor yellowColor]}];

接受端:

创建监听者,设置监听到通知后的处理方法

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealChangeTheme:) name:@"ChangeTheme" object:nil];

对通知的数据处理方法

-(void)dealChangeTheme:(NSNotification *)n

{

    //获取通知中传过来的数据

    NSDictionary *userinfo = n.userInfo;

    self.view.backgroundColor = userinfo[@"color"];

}



23、通过info.plist设置状态栏高亮



24、

导航栏的创建:

在appDelegate.m

创建一个主界面控制器

创建一个导航栏控制器,设置主界面

将项目窗口的根控制器设置为导航栏控制器

    设置导航栏图片 

注意图片两种大小

    如果高度44, 只显示在导航栏区域

  如果高度64, 扩展到状态栏

MainViewController *mvc = [[MainViewController alloc] init];


UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];

self.window.rootViewController = nc;


25、在主界面加载其他界面

旧方法回顾:

A加载B,A使用present加载,B使用dismiss退回


新的方法:使用导航栏控制器+栈完成

A加载B

A压栈加载B:

[ws.navigationController pushViewController:cvc animated:YES];

B弹栈退回A

[self.navigationController popViewControllerAnimated:YES];


ps:默认Navigate的每一次压栈,新界面导航栏上都有一个默认左按钮会弹栈退回A

26、

导航添加按键

注意:

一定要在self.navigationItem.rightBarButtonItem上添加

步骤:

创建按键

创建UIBarButtonItem

给self.navigationItem.rightBarButtonItem赋值


26、navigater的工具栏toolbar

默认隐藏,下面这一句解除隐藏

self.navigationController.toolbarHidden = NO;

添加工具栏按键(和导航栏按键一样)

UIBarButtonItem*item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];

添加工具栏空白按键,设置合适的宽度用于填充

    UIBarButtonItem *spaceCustumItem = [[UIBarButtonItem alloc]       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];

     spaceCustumItem.width = 100;

设置工具栏数组(顺序即布局)

self.toolbarItems = @[item1,spaceCustumItem,item2,spaceCustumItem,item3];


27、tabBar标签栏(最大的分类)

确定标签栏一共总控几个界面,有几个界面就创建几个控制器

创建界面控制器A

创建导航栏,设置导航栏根控制器为A

设置每个控制器的title字符串

设置每个控制器的tabbar image

上述步骤有几个大类界面执行几次

创建标签栏

赋值标签栏ViewControllers数组为上面创建的所有导航栏控制器

设置标签栏背景图高度(必须为49)

设置标签栏标签被选中时颜色

设置当前工程根控制器为标签栏控制器

28、自己调用自己的时候会出现循环引用,解决方式就是将其中一个变为弱指针


实例:

__weak typeof (self) ws = self;

[self.view addSystemButtonWithFrame:CGRectMake(10010010030title:@"返回1界面" action:^(ZTButton *button) {

        

        //切换到导航控制器管理的第一个界面

        //[ws.navigationController popToRootViewControllerAnimated:YES];

        

        //之前的界面的指针

        NSArray *array = ws.navigationController.viewControllers;

        

        ws.navigationController.navigationBar.hidden = NO;

        [ws.navigationController popToViewController:array[0animated:YES];

    }];


29、设置核心动画效果
使用:在打开新页面时调用设置动画效果的接口

 [ws.navigationController.view.layer addAnimation:[ws createTransitionAnimation] forKey:nil];


核心动画的设置过程

-(CATransition *)createTransitionAnimation

{

    //切换之前添加动画效果

    //后面知识: Core Animation 核心动画

    //不要写成: CATransaction

    //创建CATransition动画对象

    CATransition *animation = [CATransition animation];

    //设置动画的类型:

    animation.type = @"oglFlip";

    //设置动画的方向

    animation.subtype = kCATransitionFromRight;

    //设置动画的持续时间

    animation.duration = 1.5;

    //设置动画速率(可变的)

    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    //动画添加到切换的过程中

    return animation;

}


30、

使用通知进行切页操作


在appDelegate.m的第一个方法中,通过判断消息来加载页面

    

[[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(showLoginPage) name:@"showLoginPage" object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showMainPage) name:@"showMainPage" object:nil];

想切页的话,就发消息即可

 [[NSNotificationCenter defaultCenter] postNotificationName:@"showMainPage" object:nil userInfo:nil];


31、设置图片的拉伸方式
有时候图片大小不能满足要求,就需要用到这个方法

 UIImage *image = [[UIImage imageNamed:@"rr_pub_button_pressed_silver.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:5];


32、切页操作三种

present/dismiss

push/pop

notify-post/notify-addobserve

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值