一些有关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);