zoukankan      html  css  js  c++  java
  • 一周随笔--15.9.28

    一周新知识点记录(15.9.28)

    一.阴影(NSShadow)参考

    self.view.layer.shadowColor = [UIColor blackColor].CGColor;  //阴影颜色
    
    self.view.layer.shadowOffset = CGSizeMake(10, 10);  //阴影偏移 四周阴影则设置为CGSizeZero
    
    self.view.layer.shadowOpacity = 1;   //阴影透明度,默认为0,不显示
    
    self.view.layer.shadowRadius = 10;   //阴影半径 默认为3

    二.第三方库Masonry代码自动布局

    1、mas_equalTo是equal to的宏定义,equalTo后面的参数只能是常用数值类型,mas_equalTo后面还可以跟CGsize类型的参数。如下,只能用mas_equalTo

    make.size.mas_equalTo(CGSizeMake(img.size.width, img.size.height));

    2、下面这句中参数为self.buttonLogin.mas_right,不能写成self.buttonLogin.right

    make.right.mas_equalTo(self.buttonLogin.mas_right);

    3

    只要添加了这个宏,就不用带mas_前缀 #define MAS_SHORTHAND

    只要添加了这个宏,equalTo就等价于mas_equalTo #define MAS_SHORTHAND_GLOBALS

    头文件#import "Masonry.h"一定要放在上面两个宏的后面


    三.可以获取段落高度的断行模式

    只有断行模式为NSLineBreakByWordWrapping和NSLineBreakByCharWrapping的段落才能正常获取到文本高度。

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
    paragraphStyle.lineSpacing = 2;
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
    NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:14.0f],NSParagraphStyleAttributeName:paragraphStyle};
    CGFloat hegiht = [string boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size.height;

     四.extern的使用

    extern是变量扩展的关键字,用其声明的变量也称为全局变量,通过它可以跨文件使用同一个变量。使用方法是:

    在一个类的.m文件中申明全局变量。例:

    NSString *externString = @"haha";

    在另一个文件中使用(可以修改):

    extern NSString *externString;

    注意:假如申明放在一个类的.h文件中,在使用extern NSString *externString;的类中就不能导入申明类的.h头文件,会报duplicate(重复)错误。


    五.StoryBoard(故事板)的Segue用法及代码加载

    1、storyboard中可以设置点击某个button直接push到下一个视图。如果button所在视图控制器重写了

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

    通过 segue.destinationViewController 可以获取目标目标视图控制器,这样可以在push前对目标视图控制器相关参数进行设置。也可以将button所在的视图控制器push关联到目标视图控制器,并设置storyboard segue的identifier,通过

    [self performSegueWithIdentifier:@"PushToTest" sender:nil];

    push到目标视图控制器,sender为需要传递到方法-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender的数据对象。

     

    2、加载故事版(storyboard)中的视图控制器:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Test" bundle:nil]; //name不用加.storyboard后缀
    
    UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@"TestViewController"];
    
    //@“TestViewController”为storyboard中指定试图控制器的ID,UIViewController为故事板中视图控制器对应的类

    instantiateInitialViewControllerinstantiateViewControllerWithIdentifier:的区别:

    前者获取到的是storyBoard中初始化的那个界面(入口界面),后者则根据identifier参数获取到整个storyboard中任意的界面(由identifier决定)。


     六.automaticallyAdjustsScrollViewInsets

    当我们在一个UIViewController中同时创建2个tableView的时候,如果把它们的frame中的Y坐标设置为一样,你可能会发现它们的位置并没有达到你想要的结果.比如第一tableView个frame(0,0,320,568),另一个也frame(0,0,320,568),结果会发现第二个tableView的第一行数据被导航栏遮挡了,以至于我们不得已把第二个frame改成(0,64,320,568-64).因此当我们一个界面有多个tableView之类的,要将视图控制器的automaticallyAdjustsScrollViewInsets设置为NO,完全由自己手动来布局,就不会错乱了。

    PS:实际测试并没有出现这种问题


    七.字符串内容替换

    NSString *string2 = [string1 stringByReplacingOccurrencesOfString:@"b" withString:@"y"];

    用@"y"替换string1中所有的@"b",得到替换后的字符串string2

    NSString *string3 = [string1 stringByReplacingOccurrencesOfString:@"b" withString:@"y" options:NSCaseInsensitiveSearch range:NSMakeRange(0, 4)];

    用@"y"替换string1中0·4索引范围内的@"b",比较方式为NSCaseInsensitiveSearch,得到替换后的字符串string3 

    关于比较方式枚举:

    enum{
        NSCaseInsensitiveSearch = 1,//不区分大小写比较
        NSLiteralSearch = 2,//区分大小写比较
        NSBackwardsSearch = 4,//从字符串末尾开始搜索
        NSAnchoredSearch = 8,//搜索限制范围的字符串
        NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
        NSDiacriticInsensitiveSearch = 128,//忽略 "-" 符号的比较
        NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果
        NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者NSOrderedDescending
        NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:…, stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:… 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch
    }

    八.获取当前视图控制器

    //获取当前屏幕显示的viewcontroller
    - (UIViewController *)currentViewController{
      UIWindow
    *keyWindow = [UIApplication sharedApplication].keyWindow; // modal展现方式的底层视图不同 // 取到第一层时,取到的是UITransitionView,通过这个view拿不到控制器,因此针对这个特例取到第二层避免 UIView *firstLayoutContainerView = [keyWindow.subviews firstObject]; UIView *secondLayoutContainerView = [firstLayoutContainerView.subviews firstObject]; UIViewController *vc = [self parentControllerForView:secondLayoutContainerView]; if (vc) { if ([vc isKindOfClass:[UITabBarController class]]) { //容器为UITabBarController UITabBarController *tab = (UITabBarController *)vc; if ([tab.selectedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *nav = (UINavigationController *)tab.selectedViewController; return [nav.viewControllers lastObject]; } else { return tab.selectedViewController; } } else if ([vc isKindOfClass:[UINavigationController class]]) { //容器为UINavigationController UINavigationController *nav = (UINavigationController *)vc; return [nav.viewControllers lastObject]; } }else{ //无容器 return [self parentControllerForView:firstLayoutContainerView]; } return nil; } //通过响应者链条获取view所在的控制器 - (UIViewController *)parentControllerForView:(UIView *)view{ UIResponder *responder = [view nextResponder]; while (responder) { if ([responder isKindOfClass:[UIViewController class]]) { return (UIViewController *)responder; } responder = [responder nextResponder]; } return nil; }

     

  • 相关阅读:
    正则表达式的三种模式【贪婪、勉强、侵占】的分析
    php实用的文件上传类
    php简单实用的验证码生成类
    phpstorm不安装apache就可以本地测试PHP
    Ajax技术——带进度条的文件上传
    Mybatis 多表查询及查询结果映射
    关于textarea包在div的自适应问题
    Luogu P3200 [HNOI2009]有趣的数列
    群&置换群&burnside
    卡特兰树
  • 原文地址:https://www.cnblogs.com/lotheve/p/4843819.html
Copyright © 2011-2022 走看看