1、线程两种方式:
//1、新开启一个线程 [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:nil]; //2、GCD线程 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); size_t number = 100; dispatch_async(queue, ^{ dispatch_apply(number, queue, ^(size_t iteration) { }); });
2、双击事件被单击事件拦截
[singleTap requireGestureRecognizerToFail:doubleTap];
3、调试时获取类名
DLOG(@"%@",NSStringFromClass([vc class]));//通过类获取类名 DLOG(@"%@",NSClassFromString(@"DiscoverViewController"));//通过类名获取类
4、KVO,“一对一”对象之间的通信,例子如下:
#import <Foundation/Foundation.h> @interface StockData : NSObject @property(nonatomic,strong) NSString *stockName; @property(nonatomic,assign) float price; @end #import "StockData.h" @implementation StockData @end
#import <UIKit/UIKit.h> @interface ViewController : UIViewController - (IBAction)btnAction:(id)sender; @property (weak, nonatomic) IBOutlet UILabel *labShow; @end // // ViewController.m // A // KVO例子 // Created by cs on 15/6/7. // Copyright (c) 2015年 dwen. All rights reserved. // #import "ViewController.h" #import "StockData.h" @interface ViewController (){ StockData *stock; UILabel *_lab1; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; stock = [[StockData alloc] init]; [stock setValue:@"中展" forKey:@"stockName"]; [stock setValue:@"100.0" forKey:@"price"]; [stock addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; _labShow.text = [NSString stringWithFormat:@"%@",[stock valueForKey:@"price"]]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (IBAction)btnAction:(id)sender { //设值 [stock setValue:@"20.0" forKey:@"price"]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"price"]) { _labShow.text = [NSString stringWithFormat:@"%@",[stock valueForKey:@"price"]]; } }
- (void)dealloc{
//TODO 清空释放掉
[selfremoveObserver:selfforKeyPath:@"price"context:nil];
} @end
5、instancetype和id区别:
相同点:都可作为方法的返回类型
不同点:
一、instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型对象。
二、instancetype只能作为返回值,不能像id那样作为参数
6、UImage防止拉伸设置
UIImage *selectImg = [UIImage imageNamed:@"select-checked"]; UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 0, 30); selectImg = [selectImg resizableImageWithCapInsets:insets]; [btn setBackgroundImage:selectImg forState:UIControlStateNormal];
7、ios中的时间毫秒,long型
NSNumber *createAtN = [dicPushBody objectForKey:@"createAt"];
long createAt = [createAtN longValue];
8、获取年、月、日
NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now]; int year = (int)[dateComponent year];//年
9、url schemes 可在Safari浏览器中打开应用。前提是需在工程中plist文件中配置下
配置好后,刷到真机上。然后在Safari地址中输入:artgoer://com.test 就可打开应用。
10、设置tabBar背景色
self.tabBar.barTintColor = [ColorUtilcolorFromHexRGB:@"#000000"];//设置tabBar背景色
11、block回传参数应用示例:
block适合两个页面之前传值,不适合页面乘积深时,回传参数。
AddressManageViewController.h文件
//定义block typedef void (^AddressManageBlock) (AddressVo *addressVo);//回传参数 @interface AddAddressViewController : UITableViewController //声明block @property (strong, nonatomic) AddressManageBlock addressBlock; @end
AddressmanageViewController.m文件
if (self.addressBlock) { self.addressBlock(aVo); [self.navigationController popViewControllerAnimated:YES]; }SettlementViewController.m文件
//地址管理 - (void) goAddressManageAction{ AddressManageViewController *addressVc = [StoryboardUtil getVCWithSbIden:@"My" identify:@"AddressManageViewController"]; addressVc.scourceType = NSStringFromClass([SettlementViewController class]); [self.navigationController pushViewController:addressVc animated:YES]; addressVc.addressBlock = ^(AddressVo *aVo){ //TODO self.addressVo = aVo; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; }; }
12、滑动返回上一页。在push后添加如下代码。
GoodsDetailViewController *goodsDetailVC = [StoryboardUtil getVCWithSbIden:@"Goods" identify:@"GoodsDetailViewController"]; [self.navigationController pushViewController:goodsDetailVC animated:YES]; //TODO滑动返回 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.delegate = nil; }
12、把view添加到Window上
UIWindow *win = [[UIApplication sharedApplication].delegate window]; [win addSubview:self.view];
13、导航titleView添加自定义View
UIView *titleV = [[UIView alloc] init]; titleV.frame = CGRectMake(0, 0, 120, 44); _btnTopic = [UIButton buttonWithType:UIButtonTypeCustom]; [_btnTopic setFrame:CGRectMake(0, 0, 50, 40)]; [_btnTopic setTitle:@"专题" forState:UIControlStateNormal]; _btnTopic.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f]; [_btnTopic setTitleColor:WordTextColor forState:UIControlStateNormal]; [titleV addSubview:_btnTopic]; _btnDisplay = [UIButton buttonWithType:UIButtonTypeCustom]; [_btnDisplay setFrame:CGRectMake(70, 0, 50, 40)]; [_btnDisplay setTitle:@"展览" forState:UIControlStateNormal]; _btnDisplay.titleLabel.font = [UIFont boldSystemFontOfSize:18.0f]; [_btnDisplay setTitleColor:TitleColor forState:UIControlStateNormal]; [titleV addSubview:_btnDisplay]; self.navItem.titleView = titleV;
14、循环布局约束
for (NSLayoutConstraint *lc in headView.lcSpace) { lc.constant = 10; }
15、图片保存到相册
//图片保存到相册 UIImageWriteToSavedPhotosAlbum(lastImg, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSString *message; if (!error) { message = @"成功保存到相册"; [self showStrAlert:@"成功保存到相册"]; }else { [self showStrAlert:[NSString stringWithFormat:@"%@",error]]; } }
16、读取ttf文件字体:
-(UIFont*)customFont{ NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"209" ofType:@"ttf"]; NSURL *url = [NSURL fileURLWithPath:fontPath]; CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url); if (fontDataProvider == NULL) return nil; CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider); CGDataProviderRelease(fontDataProvider); if (newFont == NULL) return nil; NSString *fontName = (__bridge NSString *)CGFontCopyFullName(newFont); //.... NSData *data =[fontName dataUsingEncoding:NSUTF8StringEncoding]; NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString* temp = [[NSString alloc] initWithData:data encoding:encoding];//data为NSData类型 NSLog(@"fontName======%@==%@",fontName,temp); UIFont *font = [UIFont fontWithName:fontName size:12]; CGFontRelease(newFont); return font; }
17、指定页面禁止侧滑返回:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用返回手势 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //开启返回手势,解决侧滑返回时需跳到指定页面 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = YES; } }
18、iOS懒加载
//定义 @property (nonatomic,strong) NSMutableArray *dataArr; //注意 //...在第一次使用时用self.dataArr,而不能用_dataArr,否则不会产生对象 //...当程序进来时不会产生dataArr对象,只有当第一次self.dataArr调用时,这时会走get方法。可以节省不少内存空间。实例化用懒加载是个不错选择 #pragma mark Getter - (NSMutableArray *) dataArr{ if (!_dataArr) { _dataArr = [[NSMutableArray alloc] init]; } return _dataArr; }
19.UIButton显示图片和文字,呈上下排列,图片显示上方,文字显示下方。
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = CGRectMake((ScreenWidth/4)*i, 5, ScreenWidth/4, 110); [btn.titleLabel setFont:[UIFont systemFontOfSize:15]]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn setTitle:vo.label forState:UIControlStateNormal]; btn.titleLabel.textAlignment = NSTextAlignmentCenter; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(btn.imageView.frame.origin.x+32, btn.imageView.frame.origin.y+20, 30, 30)]; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:vo.labelPic]]; UIImage *img = [UIImage imageWithData:data]; [imageView setImage:img]; [btn addSubview:imageView]; //关键代码 btn.titleEdgeInsets = UIEdgeInsetsMake(28, 0, 0, 0); btn.imageEdgeInsets = UIEdgeInsetsMake(-15,25,0,0);