• iOS 小知识点(持续更新)


    1、如何通过代码设置Button  title的字体大小

    设置

    Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#>];

    2、获取当前时间

        NSDate *timeDate=[NSDate date];
        
        NSDateFormatter * dateformatter=[[NSDateFormatter alloc] init];
        
        [dateformatter setDateFormat:@"YYYYMMddHHmmsssss"];
        
        NSString *locationString=[dateformatter stringFromDate:timeDate];

    3、判断字符串是否为空字符的方法

    - (BOOL) isBlankString:(NSString *)string {
        if (string == nil || string == NULL) {
            return YES;
        }
        if ([string isKindOfClass:[NSNull class]]) {
            return YES;
        }
        if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) {
            return YES;
        }
        return NO;
    }

    4、tableView优化

        //刷新整个表格
        [_tableView reloadData];
        
        //刷新当前行
        [_tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    5、百度地图自定义大头针图片

    - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation
    {
        // 生成重用标示identifier
        static NSString *AnnotationViewID = @"AnnotationViewID";
        
        // 检查是否有重用的缓存
        BMKAnnotationView* annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
        ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorGreen;
        annotationView.image = [UIImage imageNamed:@"XXX.png"];
    }

    6、iOS APP上架所需要的 屏幕尺寸

      640*960、640*1136、750*1334、1242*2208

    7、iOS APP 图标的尺寸

      58*58、80*80、120*120、180*180

    8、

    苹果公司账号申请:
    这个是申请方法:http://jingyan.baidu.com/article/0320e2c1d153161b87507bba.html
    这个是官网:https://developer.apple.com/enroll/organization/

    9、关闭定时器

    [_myTimer invalidate];

     _myTimer = nil;

    10、键盘释放第一响应

     - (BOOL)textFieldShouldReturn:(UITextField *)textField {

     [textField resignFirstResponder];

     return YES;

    }

    11、点击UITableViewCell时,没有点击效果,

    在cellForRowAtIndexPath:方法中写上

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    12、使用NSJSONSerialization 返回的对象,取决于最外层是什么,如果是{}那就是字典,[]那就是数组等

    13、只支持竖屏,修改info.plist 文件就可以了。找到"Supported interface orientations" 设置item 项为Portrait就可以了。这个设置为全局设置。

    14、iOS开发

    先搭框架,后画界面,写功能,写接口,调试,写适配

    iOS 开发文档 流程图 UI 框架 接口 功能 适配 测试 更改
    iOS 初级开发工程师 C语言基础+swift语言基础
          中级iOS开发工程师 iOS项目开发+UI部分+动画图层部分

    15、ViewController的生命周期中各方法执行流程如下:

    init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc

    16、GCD

    1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。
    2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。
    3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。

    17、Xcode项目中我们经常遇到因为空数据(服务器传回来的数据通过JsonKit解析为之类的)导致内存泄漏进而程序崩溃的现象,这个在之前学校的时候就被坑了很多次,所以有必要封装一个非空处理的类,由于能力有限,查看一些网上的资料,想到采用递归的方式处理。

    解决办法:一个老外早已在Githud有了空处理的神器:https://github.com/nicklockwood/NullSafe,只要将这个类别(Category)加入项目中就可万事无忧,由于里面代码我也不太懂,所以大家自己研究下哈。

    18、读取plist文件

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"provinces.plist" ofType:nil];

    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];

     // 加载plist数据
        
    //     一个NSBundle对象对应一个资源包(图片、音频、视频、plis等文件)
    //     NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
    //     项目中添加的资源都会被添加到主资源包中
    //     [NSBundle mainBundle]关联的就是项目的主资源包
    
        NSBundle *bundle = [NSBundle mainBundle];
        
        // 利用mainBundle获得plist文件在主资源包中的全路径
        NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
    //    NSString *file = [bundle pathForResource:@"shops.plist" ofType:nil];
        // 凡是参数名为File,传递的都是文件的全路径
        shopsArray = [NSArray arrayWithContentsOfFile:file];

     19、懒加载:用到时再去加载,而且也只加载一次

          (1).懒加载基本

           懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法.

           注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化

          (2).使用懒加载的好处:

           好处一:不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强

           好处二:每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合

    20、

    //字符串转变为数组
    
    NSMutableString * str=[[NSMutableString alloc]initWithFormat:@"1,1,1,1,1,1"];
    
    //字符串转变为数组2
    
    NSMutableArray * array=[NSMutableArray arrayWithArray:[str   componentsSeparatedByString:@","]];
    
    //替换数组中的某个值
    
    [array replaceObjectAtIndex:4 withObject:@"2"];
    
    //把数组转换成字符串
    
    NSString *ns=[array componentsJoinedByString:@","];
    

      

    21、NSCalendar

      //1. 创建1个当前的日历对象.

        //   作用: 可以取到1个日期对象的各个部分.

        NSCalendar *calendar = [NSCalendar currentCalendar];

        //2. 指定日历对象,要去取日期对象的那些部分.

        NSDateComponents *com =  [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:date];

        //3. 通过NSDateComponents取到指定的日期的各个部分.

        NSLog(@"%lu",com.year);

        NSLog(@"%lu",com.month);

        NSLog(@"%lu",com.day);

        NSLog(@"%lu",com.weekday);

        */

    22、将NSString 拆分成array

    NSString * writerPos=@"10,30,400,300";

    NSArray *arrWriterPos =[writerPos componentsSeparatedByString:NSLocalizedString(@",", nil)];//拆分成数组

    23、UITableView每个cell之间的默认分割线如何去掉

      很简单,只需要

      tableView.separatorStyle = NO;

    24、设置tableviewcell不让选中

    1:cell.userInteractionEnabled = NO;

    2:[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    这两种方法都能实现不让cell有点击事件。

    但如果cell中有button第一个方法也会让button失去点击事件。

    25、iOS 怎么设置 UITabBarController 的第二个item为第一响应者?

        UITabBarController *VC = [[UITabBarController alloc]init];

            VC.selectedIndex = 1;

            [self.navigationController pushViewController:VC animated:YES];

    26、如何设置ios app应用名称?

    info.plist文件中添加一个key:Bundle display name,value 填上应用名称

    27、设置uiscrollview偏移量:

    scrollView.contentOffset=CGPointMake(int x, int y);

    28、状态栏

    在iOS7中,状态栏默认情况下归控制器管理,比如状态栏的样式、状态栏的是否可见

    控制器通过重写以下方法来控制状态栏

    设置状态栏的样式

    (UIStatusBarStyle)preferredStatusBarStyle;

    其中UIStatusBarStyleLightContent是白色样式

    设置状态栏的可见性

    - (BOOL)prefersStatusBarHidden;

    29、懒加载

    为了改变现状,可以考虑将图片数据线保存到一个数组中,数组中有序地放着很多字典,一个字典代表一张图片数据,包含了图片名、图片描述

    @property (strong, nonatomic) NSArray *images;

    由于只需要初始化一次图片数据,因此放在get方法中初始化

    将属性放在get方法中初始化的方式,称为“懒加载””延迟加载”

     30、OC语法规定:不允许直接修改对象的结构体属性的成员

    下面代码是错误的:

    self.headBtn.frame.origin.y -= 10;

    31、transform属性

    利用transform属性可以修改控件的位移(位置)、缩放、旋转

    创建一个transform属性(仔细看这里的方法名,里面有个Make,是和下面进行叠加方法最大的区别)

    CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,  CGFloat ty) ;

    CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy);

    CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)

    (注意:angle是弧度制,并不是角度制)

    在某个transform的基础上进行叠加

    CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty);

    CGAffineTransform CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy);

    CGAffineTransform CGAffineTransformRotate(CGAffineTransform t, CGFloat angle);

    清空之前设置的transform属性

    view.transform = CGAffineTransformIdentity;

    32、当你发现通过代码无法修改控件的位置或者尺寸的时候,应该去掉storyboard里面的autolayout功能

    33、instancetype

    instancetype在类型表示上,跟id一样,可以表示任何对象类型

    instancetype只能用在返回值类型上,不能像id一样用在参数类型上

    instancetype比id多一个好处:编译器会检测instancetype的真实类型

    34、重写init方法的使用和注意

    一定要调用super的init方法:因为初始化父类中会声明一些成员变量和其他属性

    就是调用super的init方法 最后返回的就是一个id也就是self

    有时候调用[super init]方法返回的不一定是一个self,但是为了保证它返回的是一个self就要进行一个赋值操作;

    注意:调用super 初始化完毕 就一定要赋值给self

    返回一个self意思是:返回一个已经初始化完毕的一个对象

     构造方法的注意点:

    先调用父类的构造方法[super init];

    再进行子类内部成员变量的初始化

    35、layoutSubviews作用

    layoutSubviews是对subviews重新布局。比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,既可以实现对子视图重新布局。

    layoutSubviews默认是不做任何事情的,用到的时候,需要在自雷进行重写。

    36、layoutSubviews以下情况会被调用

    苹果官方文档已经强调,不能直接调用layoutSubviews对子视图进行重新布局。那么,layoutSubviews什么情况下会被调用呢?通过百度搜索,发现以下几种情况layoutSubviews会被调用。

    直接调用setLayoutSubviews。(这个在上面苹果官方文档里有说明)
    addSubview的时候。
    当view的frame发生改变的时候。
    滑动UIScrollView的时候。
    旋转Screen会触发父UIView上的layoutSubviews事件。
    改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

    37、property的使用策略

        strong 一般是使用在OC对象上 (也可以使用在UI控件上(会有问题的))

                NSSArray  NSDictionary 模型...

        weak  一般是使用在UI控件上  也可以使用在OC对象(也是有问题的)

                UITextFeild UIButton.....

        copy   一般使用在NSString  Block

        assign  一般是使用基本数据类型上, 枚举  结构体

    38、一个控件有2种创建方式

        第一、通过代码创建

      初始化时一定会调用initWithFrame:方法

      第二、通过xibstoryboard创建

      初始化时不会调用initWithFrame:方法,只会调用initWithCoder:方法

      初始化完毕后会调用awakeFromNib方法

      有时候希望在控件初始化时做一些初始化操作,比如添加子控件、设置基本属性

      这时需要根据控件的创建方式,来选择在initWithFrame:(给控件设置位置)initWithCoder:awakeFromNib(初始化控件)的哪个方法中操作

    39、tableview 的detailTextLabel 不起作用

    要想给tableview加detailTextLabel,

    initWithStyle必须为:UITableViewCellStyleSubtitle

    40、一个 view 在父视图中心

    child.center = [parent convertPoint:parent.center fromView:parent.superview];
    

    41、键盘上方增加工具栏

    UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init];
        [keyboardDoneButtonView sizeToFit];
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneClicked:)];
    
        [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];
        txtField.inputAccessoryView = keyboardDoneButtonView;

    42、判断某一行的 cell 是否已经显示

    CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];
    BOOL completelyVisible = CGRectContainsRect(tableView.bounds, cellRect);
    

    43、隐藏 UITextView/UITextField 光标

    textField.tintColor = [UIColor clearColor];
    

    44、修改UITextField光标位置

    textFielde.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    textField.leftViewMode = UITextFieldViewModeAlways;
    

    45、Block的循环引用

      如果在Block中使用_strong修饰符的对象类型自动变量,当block从栈复制到堆时,该对象为Block所持有。这样就容易引起循环引用。

    为了避免循环引用可以使用_block变量、_weak修饰符以及_unsafe_unretained修饰符。 

    _block和_weak的区别:

    1._block可以修饰对象,也可以修饰基本类型。

    2._weak只可以修饰对象。

    3._block在block中可以被重新赋值,_weak不可以。

    _unsafe_unretained不会被自动置空为nil。

     

  • 相关阅读:
    iOS中的UISearchBar
    iOS中的UIDatePicker 日期选择器
    iOS中的 深拷贝和浅拷贝
    iOS中的定时器实现图片的轮播
    iOS Crash文件的解析(一)
    iOS中的UIToolBar
    iOS中的瀑布流(RootCollectionViewControlle)
    iOS中NSThread(主线程,子线程)
    iOS中的串行,并行,分组,一次,障碍,延迟,反复执行(GCD)
    iOS中的动画
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5165621.html
Copyright © 2020-2023  润新知