iOS常用知识

iOS常用知识_第1张图片
一些有关iOS的快捷知识,做个留存,方便后期查看使用。

1、判断是否是模拟器:

#if TARGET_IPHONE_SIMULATOR
    NSLog(@"模拟器");
#else
    NSLog(@"真机");
#endif

2、创建枚举:

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
};

3、定义字符串常量规范:(1)建议模仿苹果;(2)加上const 保证字符串不可更改;(3)应尽量保证可读性,不要怕句子太长。

.h中:

UIKIT_EXTERN NSString *const kUITableViewCellIdentifier; 

.m中:

NSString *const kUITableViewCellIdentifier = @"kUITableViewCellIdentifier";

4、如果声明的属性,只想使用的get方法,不使用set方法,并且不想让外界更改这个属性的值,那么建议在括号里面加readonly。示例:

@property(nonatomic,readonly,getter=isSelect) BOOL select;

5、setImageEdgeInsets和setTitleEdgeInsets设置button的图片和文字显示位置(默认是左图右字,上移和左移都是负,反之为正)。想两改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。

需要注意的是,对titleLabel和imageView设置偏移,是针对它当前的位置起作用的,并不是针对它距离button边框的距离的。
[button setImageEdgeInsets:UIEdgeInsetsMake(0, imageEdge, 0, -imageEdge)];
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, titleEdge, 0, -titleEdge)];

6、刷新Section:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];

7、Image转换NSString:

- (NSString *)GainImageStringFromImage:(UIImage *)image {
    NSData * data = UIImageJPEGRepresentation(image, 1.0f);
    NSString * encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];;
    return encodedImageStr;
}

NSString转换Image:

- (UIImage *)GainImageFromImageString:(NSString *)imageStr {
    NSData * data = [[NSData alloc] initWithBase64Encoding:imageStr];
    UIImage * image = [UIImage imageWithData:data];
    return image;
}

8、字典判断为空:

[dict isKindOfClass:[NSNull class]]

9、字典遍历:
说明当stop为yes时,就会停止遍历,所以我们可以在块中加入条件(即当某种条件下去停止遍历)。

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    
}];

10、设置UITextField的placeholder:

UITextField *textField = [[UITextField alloc]init];
textField.placeholder = @"请输入";
textField.textColor = k_DefaultColor666666;
textField.textAlignment = NSTextAlignmentRight;
[textField setValue:k_DefaultColor999999 forKeyPath:@"_placeholderLabel.textColor"];
[textField setValue:[UIFont systemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
textField.font = [UIFont systemFontOfSize:15];

11、(1)typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

typedef void (^Block)(void);

(2)typeof 运算符返回一个用来表示表达式的数据类型的字符串。
可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。

alert(typeof (123));//typeof(123)返回"number" 
alert(typeof ("123"));//typeof("123")返回"string"

12、UIStoryboard创建:

SecondViewController * second = [[UIStoryboard storyboardWithName:@"First" bundle:nil]instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self presentViewController:second animated:YES completion:nil];

XIB创建:

MainViewController * main = [[MainViewController alloc]initWithNibName:@"MainViewController" bundle:[NSBundle mainBundle]];
BaseView * base = [[[NSBundle mainBundle]loadNibNamed:@"BaseView" owner:self options:nil] firstObject];

13、模态试图:

page.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
page.modalPresentationStyle = UIModalPresentationOverCurrentContext;

14、newRect = [someView convertRect:rect toView:toView];
解释: rect是相对于someView的,以toView为坐标系重新计算rect的值
newRect = [someView convertRect:rect fromView:fromView];
解释: rect是以fromView为坐标系下的值,将rect转为以someView为坐标系的值
https://www.jianshu.com/p/dcefe7150bfe


15、比较两个xx是否一样:

//比较两个frame是否一样
CGRectEqualToRect(frame, CGRectZero)
//比较两个point是否一样
CGPointEqualToPoint(point, CGPointZero)
//比较两个size是否一样
CGSizeEqualToSize(size, CGSizeZero)

16、打印frame:

NSLog(@"%@",NSStringFromCGRect(self.frame));

文档中:

UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
UIKIT_EXTERN NSString *NSStringFromCGVector(CGVector vector);
UIKIT_EXTERN NSString *NSStringFromCGSize(CGSize size);
UIKIT_EXTERN NSString *NSStringFromCGRect(CGRect rect);
UIKIT_EXTERN NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
UIKIT_EXTERN NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
UIKIT_EXTERN NSString *NSStringFromDirectionalEdgeInsets(NSDirectionalEdgeInsets insets) API_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));
UIKIT_EXTERN NSString *NSStringFromUIOffset(UIOffset offset);

17、快速打真机测试ipa包:
(1)、创建空文件夹Payload;
(2)、将项目中Products下的xxx.aap复制到文件夹中;
(3)、压缩文件夹,该后缀名zip为ipa,则可获取ipa包。
安装:pp助手-应用游戏-应用列表,直接将ipa拖到应用列表即可安装。


18、获取绝对值:

fabs(<#double#>)  // 得出double类型数的绝对值
fabsf(<#float#>) // 得出float类型数的绝对值
abs(<#int#>)  // 得出int类型数的绝对值

19、访问麦克风权限:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
     if (granted) {
         NSLog(@"Authorized");
     }else{
         NSLog(@"Denied or Restricted");
     }
}];

20、设置没有弹簧反弹效果:

scrollView.bounces = NO;//设置没有弹簧反弹效果

21、UIScrollView内容向下偏移20问题处理,在控制器添加:

self.automaticallyAdjustsScrollViewInsets = NO;
if (@available(iOS 11.0, *)) {
    UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

22、获取项目中可使用字体:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"所有字体 == %@: %@", fontFamily, fontNames);
}

23、Xcode系统配置包路径:

快捷键:shift+command+G
路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

24、mac上需要开启允许任何来源,来运行第三方下载的软件。
解决方法:打开终端,然后输入以下命令:

sudo spctl --master-disable 

25、实现模糊效果:

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"found"]];
UIVisualEffectView * visualView = [[UIVisualEffectView alloc]init];
visualView.frame = self.view.bounds;
visualView.effect = nil;
[self.view addSubview:visualView];
[UIView animateWithDuration:3 delay:1 options:UIViewAnimationOptionRepeat animations:^{
    visualView.effect = [[UIVisualEffectView alloc]initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]].effect;
} completion:^(BOOL finished) {
        
}];

26、打印地址:%p

NSMutableString * tempMStr = [[NSMutableString alloc]initWithString:@"strValue"];
NSLog(@"tempMStr值地址:%p,tempMStr值%@,tempMStr值引用计数%@", tempMStr,tempMStr,[tempMStr valueForKey:@"retainCount"]);

打印方法名:

NSLog(@"--- %s ---",__func__);//__func__打印方法名

27、单例:

+ (instancetype) instance {
    static trHttpClient *_instance = nil;
    static dispatch_once_t trHttpClientPredicate;
    dispatch_once(&trHttpClientPredicate, ^{
        _instance = [[self alloc] initSingleton];
    });
    return _instance;
}

28、两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。
在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。

@property (nonatomic, copy, nonnull) NSArray * items;
@property (nonatomic, copy) NSArray * __nonnull items;

29、&和&&
&:不管前面的条件是否正确,后面都执行。
&&:前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。


30、GitHub的README.md 图片:

![水波浪加载动画](https://github.com/wuyukobe24/WaveLoadAnimation/blob/master/水波浪.gif)

图片:

![图片名](http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0.jpg) 

文字链接:

[](http://jianshu.io)

网址链接:



31、比较:

char   字符      字节2 位数16  数值范围:0 〜 2x10^6-1
int    整型      字节4 位数32  数值范围: -2147483648〜+2147483647  有效数位 10 
long   长整型    字节8 位数64   数值范围 -2^63〜2^63 - 1
float  单精度浮点 字节4 位数32   数值范围 -3.4×10^-38〜3.4×10^38    有效数位 6~7    小数点后一位
double 双精度浮点 字节8 位数64   数值范围 -1.7×10^-308〜1.7×10^308  有效数位 6~7    小数点后两位

32、iOS设备:

iPhone各机型尺寸:
机型          屏幕尺寸 屏幕宽高(像素)   屏幕宽高(点)  模式
iPhone 3GS   3.5    320 x 480       320 x 480    1x
iPhone 4S    3.5    640 x 960       320 x 480    2x
iPhone 5SE   4      640 x 1136      320 x 568    2x
iPhone 8     4.7    750 x 1334      375 x 667    2x
iPhone 8 P   5.5    1242 x 2208     414 x 736    3x
iPhone X     5.8    1125 × 2436     375 × 812    3x
iPad各机型尺寸:
1、9.7寸   (width = 1024, height = 768)
2、10.5寸  (width = 1024, height = 768)
3、11寸    (width = 1194, height = 834)
4、12.9寸  (width = 1366, height = 1024)

33、重写description方法:

#import 

- (NSString *)description {
    unsigned int count;
    const char *clasName = object_getClassName(self);
    NSMutableString *string = [NSMutableString stringWithFormat:@"<%s: %p>:[ \n",clasName, self];
    Class clas = NSClassFromString([NSString stringWithCString:clasName encoding:NSUTF8StringEncoding]);
    Ivar *ivars = class_copyIvarList(clas, &count);
    for (int i = 0; i < count; i++) {
        @autoreleasepool {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            //得到类型
            NSString *type = [NSString stringWithCString:ivar_getTypeEncoding(ivar) encoding:NSUTF8StringEncoding];
            NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
            id value = [self valueForKey:key];
            //确保BOOL 值输出的是YES 或 NO,这里的B是我打印属性类型得到的……
            if ([type isEqualToString:@"B"]) {
                if ([[NSString stringWithFormat:@"%@",value] isEqualToString:@"0"]) {
                    value = @"NO";
                } else {
                    value = @"YES";
                }
            }
            [string appendFormat:@"\t%@ = %@\n",[self delLine:key], value];
        }
    }
    [string appendFormat:@"]"];
    return string;
}

//去掉下划线
- (NSString *)delLine:(NSString *)string {    
    if ([string hasPrefix:@"_"]) {
        return [string substringFromIndex:1];
    }
    return string;
}

34、Xcode创建bundle文件:

  • command + shift + n 创建新工程,顶部选择“macOS”,然后Framework&Library中选择“Bundle”,然后“Next”,填写项目名称 Produce Name,项目则创建成功;
  • info.plist中修改Bundle name 和Executable file 为创建的项目名称,Localization native development region 设置为“en”;
  • Build Setting中设置 Base SDK 为 “iOS”,底部COMBINE_HIDPI_IMAGES 为“NO”;
  • Command+B编译一下,在Products文件夹的.bundle文件下Show In Finder就可以找到制作好的bundle包了。将其添加到其他项目中就可以用了。

35、模拟器沙河路径:
/Users/wangxueqi/Library/Developer/CoreSimulator/Devices/76228768-64BD-417C-9473-458B295D81CB/data/Containers/Data/Application/C765EF9B-7C43-48C1-B457-4A8E44FC3DB6


36、废弃的方法:

- (void)play DEPRECATED_MSG_ATTRIBUTE("请使用addPeriodicTimeObserverWithUsingBlock");

37、 添加防止多次响应的防抖方法

[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClick:) object:nil];
[self performSelector:@selector(buttonClick:) withObject:picUrl afterDelay:0 inModes:@[NSRunLoopCommonModes]];

38、[UIApplication sharedApplication].keyWindow和[[UIApplication sharedApplication].delegate window]区别:

答:在执行 didFinishLaunchingWithOptions: 这个代理方法时,在执行[self.window makeKeyAndVisible];方法之前,通过[UIApplication sharedApplication].keyWindow 方法获取不到window,且在执行[UIApplication sharedApplication].keyWindow之前是要执行,rootviewcontroller的代码的,因此先执行了controller中的代码,但是在controller中我们发现,在viewWillAppear和viewDidLoad 中的keywindow也是nil,但是在直到viewWillLayoutSubviews时才有了keywindow的值。但是无论何时都能获取到delegate.window。

结论:
1、在获取到window时最好使用[[UIApplication sharedApplication].delegate window]获取window
2、不要在keywindow为nil的时候给window上添加代码,例如添加弹窗。


39、Mac显示隐藏文件:
Mac显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES
Mac隐藏隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO
然后重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->重新启动


40、获取一个随机数范围在:[100,200],包括100,包括200:
int y =100 + (arc4random() % 101);

你可能感兴趣的:(iOS常用知识)