美文网首页
IOS 位运算

IOS 位运算

作者: 看谷秀 | 来源:发表于2020-09-22 15:53 被阅读0次
    UIView*view = [[UIViewalloc]init];
    
    view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    
    [self.viewaddSubview:view];
    
    意思是,自动调整自己的宽度,保证与superView左边和右边的距离不变。自动调整自己的高度,保证与superView顶部和底部的距离不变。查看autoresizingMask的类型,其实是NSUInteger 如下
    
    
    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
    
    };
    那么一个NSUInteger的类型,是怎样告诉View,既要调整自己的宽度,又要调整自己的高度的呢?
    
    左移运算符 <<    
    
    公式 x << 3 就是把x的各二进位左移3位
    
    1<<1  实际就是  0001 << 1  = 0010   转成十进制后就是  2
    
    1<<4  实际就是  0001 << 4  = 10000  转成十进制后就是  16
    UIViewAutoresizingFlexibleWidth   =  00010
    
    UIViewAutoresizingFlexibleHeight = 10000
    
    或运算符 |
    
    只要对应的二个二进位有一个为1时,结果位就为1
    
    00010 | 10000  = 10010 
    UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight 就是
    
    00010 | 10000 = 10010
    
    autoresizingMask 的结果就是二进制数 10010,我们如何知道 是哪个选项被选中了?
    
    与运算符 &
    
    只有对应的二个二进位都为1时,结果位才是1
    
    10010 & 00010 = 00010 
    
    
    判断选项是否被选中的方法如下
    
    if(view.autoresizingMask&UIViewAutoresizingFlexibleWidth){
    
     NSLog(@"UIViewAutoresizingFlexibleWidth被选中了"); //code1
    
    }
    autoresizingMask = 10010
    
    UIViewAutoresizingFlexibleWidth  = 00010
    
    10010 & 00010 = 00010 等价于十进制 2,为真,所以code1被执行。
    
    if(view.autoresizingMask&UIViewAutoresizingFlexibleHeight){
    
    NSLog(@"UIViewAutoresizingFlexibleHeight被选中了");//code2
    
    }
    autoresizingMask = 10010
    
    UIViewAutoresizingFlexibleWidth  = 10000
    
    10010 & 10000 = 10000 等价于十进制 16,为真,所以code2被执行。
    
    if(view.autoresizingMask&UIViewAutoresizingFlexibleLeftMargin){
    
    NSLog(@"UIViewAutoresizingFlexibleLeftMargin");//code3
    
    }
    autoresizingMask = 10010
    
    UIViewAutoresizingFlexibleWidth  = 00001
    
    10010 & 00001 = 00000 等价于十进制 0,为假,所以code3不会被执行。
    
    这样我们就知道autoresizingMask 是怎么起作用的了。
    
    实战演练:
    
    在图文混排时,我么通常需要在一段文字中,检测是否有网络地址URL, 是否有表情符号Emoji,是否有电话号码,是否有邮箱等等。
    
    typedef NS_OPTIONS(NSUInteger, FWDetectorTypes) {
    
    FWDetectorTypesNone=0,
    
    FWDetectorTypesURL=1<<0,  //1
    
    FWDetectorTypesEmoji=1<<1,  //2
    
    FWDetectorTypesPhoneNumber=1<<2,  //4
    
    FWDetectorTypesEmail=1<<3,  //8
    
    };
    /**
    
    需要识别的类型:默认识别表情
    
    **/
    
    @property(nonatomic,assign)FWDetectorTypes types;
    如果我们只需要识别表情
    
    types =FWDetectorTypesEmoji;
    如果我们需要同时识别表情,电话,链接
    
    types =FWDetectorTypesEmoji |FWDetectorTypesURL|FWDetectorTypesPhoneNumber
    内部逻辑处理时:
    
    if(types & FWDetectorTypesURL){
    
    //识别链接逻辑代码
    
    }
    
    if(types & FWDetectorTypesEmoji){
    
    //识别表情逻辑代码
    
    }
    
    if(types & FWDetectorTypesPhoneNumber){
    
    //识别电话号码逻辑代码
    
    }
    
    if(types & FWDetectorTypesEmail){
    
    //识别邮箱逻辑代码
    
    }
    明白三个运算符 左移(<<)、与(&)、或(|) 的运算法则,就能理解UIView的属性autoresizingMask
    
    一个NSUInteger类型,为什么能枚举出许多种类型了。
    
    

    相关文章

      网友评论

          本文标题:IOS 位运算

          本文链接:https://www.haomeiwen.com/subject/lavwyktx.html