蓝懿 ios技术交流和心得分享12.31

 明天就是元旦了  2016年啦   加油吧  明天你好!!

键盘监听:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong)UIToolbar *toolbar;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    //监听键盘显示

//    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

//    

//    // 键盘将要隐藏, 就会发出UIKeyboardWillHideNotification

//    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    self.toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 667-44, 375,44)];

    self.toolbar.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.toolbar];

    

    

    UITextField *tf = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 100,100)];

    [self.view addSubview:tf];

    //添加一个监听键盘改变的通知

     [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

    

}

-(void)keyboardWillChange:(NSNotification *)noti{

    

    // 1.获取键盘弹出的时间

    CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];

    NSLog(@"-=-= %f",duration);

    // 2.动画

    [UIView animateWithDuration:duration animations:^{

        // 取出键盘高度

        CGRect keyboardF = [noti.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];

        CGFloat keyboardH = keyboardF.size.height;

        if (keyboardF.origin.y==667) {//收键盘

            self.toolbar.transform = CGAffineTransformIdentity;

        }else{

            self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardH);

        }

    }];

    

    

}

-(void)keyboardWillShow:(NSNotification *)noti{

    

    // 1.获取键盘弹出的时间

    CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];

//    // 2.动画

    [UIView animateWithDuration:duration animations:^{

//        // 取出键盘高度

       CGRect keyboardF = [noti.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];

        CGFloat keyboardH = keyboardF.size.height;

        //让控件做位置偏移的 transform

        self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardH);

        

    }];

    

}

-(void)keyboardWillHide:(NSNotification *)noti{

    

    // 1.获取键盘弹出的时间

    CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];

    

    //    // 2.动画

    [UIView animateWithDuration:duration animations:^{

        //还原

        self.toolbar.transform = CGAffineTransformIdentity;

    }];

    

}

对于IOS的app开发者来说,不会像Android开发者一样为很多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,但是从设计模式上来说这不是好的做法。而且也还有一些问题,如iPhone5的适配,横竖屏的切换等。或许你可以做两套UI方案来做适配,但是这样增加重复工作量,而且不够高端,万一有出新的屏幕大小了呢。哲理就将介绍IOS中的两大自动布局利器:Autoresizing 和 Autolayout。 autoresizing是UIView的属性,一直都有,使用简单,但是没有autolayout强大。autolayout是IOS6以后的新技术,更加强大。本文主要介绍Autoresizing的特性和用法。

1. Autoresizing特性

UIViewautoresizesSubviewsYES时,(默认是YES), 那么在其中的子view会根据它自身的autoresizingMask属性来自动适应其与superView之间的位置和大小。

autoresizingMask是一个枚举类型, 默认是UIViewAutoresizingNone, 也就是不会autoresize:

123456789
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {    UIViewAutoresizingNone                 = 0,    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,    UIViewAutoresizingFlexibleWidth        = 1 << 1,    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,    UIViewAutoresizingFlexibleHeight       = 1 << 4,    UIViewAutoresizingFlexibleBottomMargin = 1 << 5};

这个枚举类型,使用了 1 << n 这样的写法来定义,代表了它可以复选。如果你不明白为什么,可以复习下“位运算”。 那么这些值分别代表什么意思呢?

其实如何理解这几个值很简单,那就是从xib里面看。 我们在一个xib文件中,取消勾选autolayout,(默认使用autolayout时,autoresizing看不到)。那么我们可以在布局那一栏看到如何设置autoresizing.

上图说明了在xib中设置的这些线条和实际属性对应的关系,这其中需要注意的是,其中4个margin虚线才代表设置了该值,而width和height是实线代表设置了该值,不能想当然的理解。

这些项分别代表:

autoresizingMask是子视图的左、右、上、下边距以及宽度和高度相对于父视图按比例变化,例如:

UIViewAutoresizingNone 不自动调整。

UIViewAutoresizingFlexibleLeftMargin 自动按比例调整与superView左边的距离,且与superView右边的距离不变。

UIViewAutoresizingFlexibleRightMargin 自动按比例调整与superView的右边距离,且与superView左边的距离不变。

UIViewAutoresizingFlexibleTopMargin  自动按比例调整与superView的顶部距离,且与superView底部的距离不变。

UIViewAutoresizingFlexibleBottomMargin 自动按比例调整与superView的底部距离,且与superView顶部的距离不变。

UIViewAutoresizingFlexibleWidth 自动按比例调整宽度。

UIViewAutoresizingFlexibleHeight 自动按比例调整高度。

UILabel*    label = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 40)];

[label setAutoresizingMask: UIViewAutoresizingNone];  控件相对于父视图坐标值不变   

CGRectMake(50, 100, 200, 40)

UIViewAutoresizingFlexibleWidth:控件的宽度随着父视图的宽度按比例改变    例如

label宽度为 100     屏幕的宽度为320          当屏幕宽度为480时      label宽度  变为  100*480/320

以上这些都较易理解, 但是autoresizing还有一些组合场景。那就是组合使用的场景。

autoresizingMask

说明

xib预览效果

None

view的frame不会随superview的改变而改变(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)

TopMargin | BottomMargin

view与其superView的上边距和下边距的比例维持不变

LeftMargin | RightMargin

view与其superView的左边距和右边距的比例维持不变(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)

LeftMargin | RightMargin | TopMargin | BottomMargin

view与其superView的上下左右边距的比例维持不变

LeftMargin | Width

view与其superView的右边距的比例维持不变, 左边距和width按比例调整(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)

LeftMargin | Width | RightMargin

左边距、右边距、宽按比例调整,(右图的xib中预览效果与实际效果有差,实际效果是view的上边距不变)

Width | Height

自动调整view的宽和高,保证上下左右边距不变。

上面并未列举所有组合场景,但是已经足够我们理解 autoresizing 了。

2. 小结

Autoreszing的最常见的实用场景就是iPhone5的兼容了。比如我们想要设置tableView的frame,那我们只需要在初始化设置frame之后将tableView的autoresizingMask设置为UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight 就行了。

另一种比如我们想要一个view一直停留在其superview的最下方,那么我们在初始化设置frame之后只需要将autoresizingMask设置为UIViewAutoresizingFlexibleTopMargin 就可以了。

autorezingMask简单的一个属性,理解它之后可以让很多事情变得简单

学习ios  重要还是要理清楚思路  在做或者看老师代码的时候 自己多想想为什么  不要自己看着就抄       另外还是要推荐一下 蓝懿IOS这个培训机构  和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!

                                                                  写博客第八十二天;

                                                                              QQ:565803433


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下有很多压测工具,常用的有Apache JMeter、Gatling、wrk、ab等。这里以wrk为例,介绍一下推进和使用方法。 1. 安装wrk 可以从https://github.com/wg/wrk/releases下载wrk的源码包,解压后进入wrk目录,执行以下命令进行编译: ``` make ``` 编译完成后,将wrk可执行文件拷贝到系统PATH路径下即可。 2. 使用wrk进行压测 wrk的使用方法比较简单,以下是一个例子: ``` wrk -t4 -c100 -d30s http://localhost:8080/index.html ``` 这条命令表示开启4个线程,每个线程使用100个HTTP连接,持续30秒,访问http://localhost:8080/index.html页面,并输出压测结果。 3. 压测结果分析 wrk的输出结果包含三个部分:请求的数量、请求的吞吐量和请求的延迟。其中,请求的数量和吞吐量可以直接用于评估系统的性能,而请求的延迟则可以用于优化系统的性能。 例如,以下是一条wrk的输出结果: ``` Running 30s test @ http://localhost:8080/index.html 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 11.95ms 21.48ms 236.34ms 92.09% Req/Sec 9.46k 1.62k 12.31k 82.50% 1130403 requests in 30.06s, 181.17MB read Socket errors: connect 0, read 0, write 0, timeout 238 Requests/sec: 37603.86 Transfer/sec: 6.03MB ``` 其中,Requests/sec表示每秒钟处理的请求数量,Transfer/sec表示每秒钟传输的数据量,Latency表示每个请求的平均延迟,Req/Sec表示每个线程的请求数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值