iOS

iOS - 基础笔记

2020-02-11  本文已影响0人  LouisXWB

总结一些平常需要注意的点:

一、基础组件
二、组件操作
三、布局
四、基础模式
五、网络
六、线程
七、数据存储
八、多媒体
九、生命周期
十、 适配
十一、APPs
十二、组件化
十三、集成打包:

一、基础组件:

1、Frame:

frame重新赋值后会自动调节位置。

2、UILabel
        UITextField.leftViewMode = UITextFieldViewModeAlways;
        UITextField.leftView = leftview;
3、UITableView(UITableViewDelegate,UITableViewDataSource)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    
if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
}

dequeueReusableCellWithIdentifier 是根据cellId从复用队列获取。

4、UIScrollView
5、UIImageView

contentMode 使用

6、UIButton
7、UIView

普通view使用 UITapGestureRegconizer+addGestureRegconizer方法实现点击事件。

注意:addGestureRegconizer可能无效,因为手势是从上往下传递的,需要把View的userInteractionEnabled设为YES。

二、组件操作:

1、坐标转换

把局部坐标转换成全局坐标

CGRect rect = [superView convertRect:subview.frame toview:nil];

//rect是相对于someView的,以toView为坐标系重新计算rect的值
CGRect newRect = [someView convertRect:rect toView:toView];

三、布局:

1、布局的实现
2、代码

NSLayoutConstraint 的实现:

[NSLayoutConstraint activateConstraints:@[

         [NSLayoutConstraint constraintWithItem:_avatorImageView
                                      attribute:NSLayoutAttributeCenterY
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:self
                                      attribute:NSLayoutAttributeCenterY
                                     multiplier:1
                                       constant:0],

         [NSLayoutConstraint constraintWithItem:_avatorImageView
                                      attribute:NSLayoutAttributeLeft
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:self
                                      attribute:NSLayoutAttributeLeft
                                     multiplier:1
                                       constant:15]
]];

注意:为什么 translatesAutoresizingMaskIntoConstraints 使用约束布局时候,就要设置为 NO?
translatesAutoresizingMaskIntoConstraints 的本意是将frame 布局 自动转化为 约束布局,转化的结果是为这个视图自动添加所有需要的约束,如果我们这时给视图添加自己创建的约束就一定会约束冲突。

为了避免上面说的约束冲突,我们在代码创建 约束布局 的控件时 直接指定这个视图不能用frame 布局(即translatesAutoresizingMaskIntoConstraints=NO),可以放心的去使用约束了。
Reference: translatesAutoresizingMaskIntoConstraints 详解

VFL的实现:

NSString *vflString = @"H:|-15-[_avatorImageView]-0-[_nickLabel]-(>=0)-
[_commentImageView(==_avatorImageView)]-0-[_commentLabel]-15-
[_likeImageView(==_avatorImageView)]-0-[_likeLabel]-15-
[_shareImageView(==_avatorImageView)]-0-[_shareLabel]-15-|";

 [NSLayoutConstraint activateConstraints:[NSLayoutConstraint   
constraintsWithVisualFormat:vflString 
options:NSLayoutFormatAlignAllCenterY metrics:nil 
views:NSDictionaryOfVariableBindings(_avatorImageView, _nickLabel, 
_commentImageView, _commentLabel, _likeImageView, 
_likeLabel, _shareImageView, _shareLabel)]];}

@end

Masonry的实现:

[_hintL mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.mas_equalTo(self.appsIcon.mas_right);
            make.centerY.mas_equalTo(self.appsIcon.mas_top);
            make.width.and.height.mas_equalTo(17);
        }];

四、基础模式:

类与类之间的通信
1、KVO(NSKeyValueObserving)

可以监听任何object

系统提供KVO的问题:

尝试KVOController

2、delegate @protocol
@protocol xxxx_Delegate <NSObject>
  -(void) method:(Object *)pram;
@end

@property (nonatomic, weak) id<xxxx_Delegate> delegate;
if(self.delegate && self.delegate responsToSelector(method:))

五、网络:

1、基本网络请求
[NSURL URLWithString:@"xxx"] ; //url = @"xxx"

[NSURL fileURLWithPath:@"xxx"] ;//url = @"file://xxx" 

六、线程

1、NSThread
2、GCD Grand Central Dispatch

分为三大类:

切换线程:


切换线程

例如:切换到主线程

dispatch_sync(dispatch_get_main_queue(), ^{
            
});
3、NSOperationNSOperationQueue
4、Runloop
总结:
iOS中的多线程基础

七、数据存储:

1、key-value (NSUserDefault)
2、文件

NSPathUtilities 文件工具FrameWork
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 找置顶沙盒文件夹路径
NSFileManager iOS⽂件管理类

NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [pathArray firstObject];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    //创建文件夹
    NSString *dataPath = [cachePath stringByAppendingPathComponent:@"GTData"];
    NSError *creatError;
    [fileManager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&creatError];
    
    //创建文件
    NSString *listDataPath = [dataPath stringByAppendingPathComponent:@"list"];
    
    [fileManager createFileAtPath:listDataPath contents:nil attributes:nil];

    //查询文件
 BOOL fileExist = [fileManager fileExistsAtPath:listDataPath];
    
    //删除
 if(fileExist){
    [fileManager removeItemAtPath:listDataPath error:nil];
}

NSFileHandle 更精细操作的NSFileManager特别是seekToFileOffset方法

   NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:listDataPath];

   [fileHandler seekToEndOfFile];
   [fileHandler writeData:[@"def" dataUsingEncoding:NSUTF8StringEncoding]];
   [fileHandler synchronizeFile];
   [fileHandler closeFile];
3、数据库
4、序列化 NSCoder NSCoding

NSCoder:抽象类, Object 和 ⼆进制数据间进⾏转换
NSKeyedArchiver : NSCoder 的⼦类
NSCoding: 对于 Object 的序列号 & 反序列化协议
NSSecureCoding : 安全的NSCoding

NSData *listData = [NSKeyedArchiver archivedDataWithRootObject:array requiringSecureCoding:YES error:nil];
id unarchiveObj = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithObjects:[NSArray class],[GTListItem class], nil]  fromData:testListdata error:nil];
<NSSecureCoding>

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {
        self.category = [aDecoder decodeObjectForKey:@"xxx"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.category forKey:@"xxx"];
}

+ (BOOL)supportsSecureCoding{
    return YES;
}

八、多媒体

1、图片

SDWebImage

2、视频

基础使用:
AVAsset -> AVPlayItem -> AVPlayer -> AVPlayerLayer

NSURL *videoURL = [NSURL URLWithString:videoUrl];
AVAsset *asset = [AVAsset assetWithURL:videoURL];
AVPlayerItem *videoItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:videoItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
playerLayer.frame = rootView.bounds
[rootView.layer addSublayer:playerLayer];

系统提供的api主要是处理播放和ui:


视频开发过程

九、生命周期

App启动过程
1、main 函数
2、UIApplication

主要职责是:

提供 Delegate / Notification 两种⽅式处理业务逻辑:AppDelegate

控制App生命周期来调整业务逻辑:

3、UIApplicationDelegate
AppDelegate生命周期回调
4、闪屏的实现

分为:Launch Screen +Splash Screen

Launch Screen 启动屏 (系统级):
Splash Screen 闪屏(业务逻辑)

实现:

十、机型适配:

分三种:尺寸、像素和特殊机型

1、位置、⼤⼩、⽂字的适配(逻辑分辨率)

主要是针对不同屏幕的尺寸来决定是否按⽐例扩⼤

2、图⽚资源适配(物理分辨率)

根据像素密度来对图片进行2x 3x(缩放因⼦) 以及资源管理

资源管理有两种BundleImageAsset

Bundle:
ImageAsset:
3、iphoneX 适配

safeArea / 交互,包括statusbar、Home Indicator

Status Bar:
Home Indicator :
Frame 布局 —— safeAreaInsets
4、 UIScreen & UIDevice

UIScreen:获取设备的逻辑尺⼨

适配⽅案选择

位置⼤⼩⽂字适配:

资源适配:

UIDevice:获取设备的信息

十一、APPs:

分为URL Scheme 和 Universal Link

URL Scheme :

1、使App能被其他App唤起
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    return YES;
}
2、通过 Scheme 唤起其它 App
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@""]];

注意:这个方法生效的前提是必须在info -> LSApplicationQueriesSchemes 的⽩名单数组中添加,canOpenURL方法才会生效,否则返回NO,且LSApplicationQueriesSchemes的注册数量有限制。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@""] options:nil completionHandler:^(BOOL success) {
        //处理业务逻辑
    }];

Universal Link:

十二、组件化

组件化方案对比

十三、集成打包:

cocoapods

cocoapods是由Ruby语言编写的多项目集成工具,原理是把集成好的项目代码传到cocoapods,然后在要使用的项目里增加podfile文件,写好集成的第三方项目名、版本号等,然后pod install,它会自动生成一个pod项目,并把pod.xcodeproj和原来项目的projectName.xcodeproj合并为一个projectName.xcworkspace,这样项目就可以使用第三方的代码了。

注意:集成多项目后打开项目的入口是projectName.xcworkspace,而不是projectName.xcodeproj

366

上一篇下一篇

猜你喜欢

热点阅读