1:拨打电话
方式一
NSURL *url = [NSURL URLWithString:@"tel://4000-916-416"];
[[UIApplication sharedApplication] openURL:url];
方式一是最直接拨打电话,存在一个缺点:打电话结束之后,会停留在通讯录界面,不会跳转到APP界面
方式二
NSURL *url = [NSURL URLWithString:@"telprompt://4000-916-416"];
[[UIApplication sharedApplication] openURL:url];
方式二,会弹出一个提示框,我们的电话号码是4-3-4的格式,但提示框的号码是3-3-4,而且这个存在一个问题是,访问私有的API,很可能存在上架时候被拒
方式三:
if (_webView == nil) {
_webView = [[UIWebView alloc] initWithFrame:CGRectZero];
}
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"tel://4000-916-416"]]];
方式三:这个是通过内嵌一个UIWebView来实现,打完电话后,会回到应用
2.发短信
第一种方法
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://110"]];
第一种方法存在的缺点:不能回到应用,而且不能指定内容
第二种方法,利用第三方框架
1、导入 MessageUI.framework 框架。
2、引入头文件 #import <MessageUI/MessageUI.h> ,实现代理方法 <MFMessageComposeViewControllerDelegate> 。
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
[self dismissViewControllerAnimated:YES completion:nil];
switch (result) {
case MessageComposeResultCancelled:
NSLog(@"取消发送");
break;
case MessageComposeResultSent:
NSLog(@"已发送");
break;
case MessageComposeResultFailed:
NSLog(@"发送失败");
break;
default:
break;
}
}
3.发送短信方法
- (void)showMessageView:(NSArray *)phones title:(NSString *)title body:(NSString *)body
{
if([MFMessageComposeViewController canSendText]) {
MFMessageComposeViewController * controller = [[MFMessageComposeViewController alloc] init];
// --phones发短信的手机号码的数组,数组中是一个即单发,多个即群发。
controller.recipients = phones;
// --短信界面 BarButtonItem (取消按钮) 颜色
controller.navigationBar.tintColor = [UIColor redColor];
// --短信内容
controller.body = body;
controller.messageComposeDelegate = self;
[self presentViewController:controller animated:YES completion:nil];
}
else
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
message:@"该设备不支持短信功能"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:alertAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
4.回调
[self showMessageView:[NSArray arrayWithObjects:@"110", nil] title:@"test" body:@"谢谢浏览凡尘一笑的文章,如果喜欢请收藏,关注,小编会不定时为您更新"];
3.更换NSLog
我们在开发阶段经常会使用NSLog来做打印调试,一个项目下来就存在好多打印,但是在发布阶段是需要将这些打印删除的,由于我们在开发中很多打印自己有时候都很难找得到,所以我们可以自己用一个来代替NSLog
在PCH文件里面使用这个,然后就可以使用SLLog来代替NSLog
/*** 日志 ***/
#ifdef DEBUG
#define SLLog(...) NSLog(__VA_ARGS__)
#else
#define SLLog(...)
#endif
其实这个意思就是如果在调试阶段我们就使用SLLog来代替NSLog 如果在发布阶段,SLLog 就用空来代替,意思是没有使用打印调试
刚才写到了一个DEBUG 这个宏 这里突然又想和大家分享一点宏的知识,我们在定义宏时候,是可以访问到宏的
但是有时候,却发现一些访问不到,比如下面这样,然后你可能找了很久
也找不多。
其实要这样找才能找得到
4.PCH的一个注意细节
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
/*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在
#ifdef __OBJC__和#endif之间 ***/
/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
#ifdef __OBJC__
#endif
/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
#endif
/*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在#ifdef OBJC和#endif之间,如果写在了里面的话会报下面这个错误 ***/
5.颜色相关的宏
刚才小编给大家写那个宏的时候,写着写着就想多写一些其他东西,这个给大家写一下颜色相关的宏
/*** 颜色 ***/
#define SLColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a/255.0]
/*** RGB颜色 ***/
#define KRGB(r, g, b) SLColor((r), (g), (b), 255)
//整个项目背景颜色
#define ALLbackGroundColor KRGB(221, 226, 229)
/*** 随机颜色 ***/
#define RandomColor KRGB(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))
这里注意需要先写第一个,不让后面的宏就调用不到上面的第一个宏,因为顺序是由上到下来读的。注意这面的r g b 添加()的作用是为了严谨性,有时候写到 23 + 54这样就会存在逻辑运算符的顺序的问题,所以在定义宏的时候,给加上()
6.将数据写成Plist
来看一下基本的方法
这是接口:http://192.168.2.226:8090/api/financeapp/finance/getBids
需要拼接的参数
pageId=1
pageSize=20
所以我们会把接口和参数一块拼接起来变成这样
http://192.168.2.226:8090/api/financeapp/finance/getBids/pageId=1/pageSize=20
然后放到goole浏览器,当然前提是浏览器装了插件
当然这样去查看解析的数据也是不错的,只不过要一步一步拼接参数有点麻烦
下面告诉大家其实也可以用代码实现,直接生成一个plist文件在桌面
然后将桌面的plist文件点开就是这样
生成这个文件之后把刚才写的代码删除(避免重复创建)当然您喜欢也可以写成宏放到PCH文件里面,这里告诉大家怎么定义成宏,然后使用起来方便
写成宏之后的使用
7.UITableViewcell的背景色的设置
我们不应该直接使用cell.backgroundColor。Cell本身是一个UIView,我们所看到的部分其实只是它的一个Subview,也就是cell.contentView。所以,如果直接改变cell本身的背景色,依然会被cell.contentView给覆盖,没有效果。 所以,最好的方式应该是通过cell.backgroundView来改变cell的背景。按照文档说明,backgroundView始终处于cell的最下层,所以,将cell里的其它subview背景设为[UIColor clearColor],以cell.backgroundView作为统一的背景,应该是最好的方式。
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor];
cell.backgroundView = view;
但是小编在Xcode7.3的时候,试了一下,好像可以直接设置cell.backgroundColor也有用,其实在Xcode5之前是必须要这样设置的
8.仅仅只隐藏第一级导航栏,这个基础上,第二级的导航栏不要隐藏
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
9.修改状态栏为白色
在iOS9.0之前要通过这样设置
然后在AppDelegate.m中加上一句代码
这里会警告是因为我这里是iOS9.3了.估计在iOS10之后这个方法就废弃了,
但是很值得注意的是如果你使用点语法却不会出现警告
然后在AppDelegate.m中加上一句代码
现在是使用的是这个方法
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
10.启动页面时候,状态栏隐藏
只需要在info.plist中设置一下就可以了,同时,别忘记了在AppDelegate.m中加一句代码
第一步:
第二步:
11.修改UILable的某部分字颜色
- (void)touchesEnded:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event
{
[self editStringColor:self.label.text editStr:@"好" color:[UIColor blueColor]];
}
- (void)editStringColor:(NSString *)string editStr:(NSString *)editStr color:(UIColor *)color {
// string为整体字符串, editStr为需要修改的字符串
NSRange range = [string rangeOfString:editStr];
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:string];
// 设置属性修改字体颜色UIColor与大小UIFont
[attribute addAttributes:@{NSForegroundColorAttributeName:color} range:range];
self.label.attributedText = attribute;
}
12.调整UITableView的那个分割线位置
tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);
13.导航栏随着滑动时候就隐藏显示
self.navigationController.hidesBarsOnSwipe = YES;
效果图
上面导航栏随着滑动就隐藏的方法。我们也可以自己通过代码实现
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetY = scrollView.contentOffset.y + _tableView.contentInset.top;
CGFloat panTranslationY = [scrollView.panGestureRecognizer translationInView:self.tableView].y;
if (offsetY > 64) {
if (panTranslationY > 0)
{
//下滑趋势,显示
[self.navigationController setNavigationBarHidden:NO animated:YES];
} else {
//上滑趋势,隐藏
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
} else {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}
效果图
14.解决UITableViewcell分割线短了一小段的问题
默认情况是样的
在控制器中加上下面这段代码
-(void)viewDidLayoutSubviews{
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[self.tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
{
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
15.UITableView的索引背景色
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
for(UIView *view in [tv subviews])
{
if([[[view class] description] isEqualToString:@"UITableViewIndex"])
{
[view setBackgroundColor:[UIColor whiteColor]];
[view setFont:[UIFont systemFontOfSize:14]];
}
}
//rest of cellForRow handling...
}
16:修改了系统自带头文件后,Xcode会报错,需要清除缓存
/Users/电脑名的用户名/资源库/Developer/Xcode/DerivedData
例如:/Users/kevindemac/Library/Developer/Xcode/DerivedData
这里要注意kevindemac就是Finder里面的个人
来到这个文件夹下:删除文件夹的缓存就👌
17:计算文字的宽度
NSString *string = @"哇哈哈";
CGFloat stringWidth = [string sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}].width;
NSLog(@"%f",stringWidth);
总结:CGFloat titleW = [字符串 sizeWithAttributes:@{NSFontAttributeName : 字体大小}].width;
18:文字内容换行
- 如何让storyboard\xib中的文字内容换行
- 快捷键: option + 回车键:也就是你键盘上的Ctrl
- 在storyboard\xib输入\n是无法实现换行的
- 在代码中输入\n是可以实现换行的
19:有透明度的颜色
[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.2];
[UIColor colorWithWhite:1.0 alpha:0.2];
[[UIColor whiteColor] colorWithAlphaComponent:0.2];
20:解决tableView出现多余行的问题
比如出现这种情况:
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
21:UIimageView的创建问题
//第一种创建方式:图片本身是多大创建出来的图片就是多大
UIImageView *image1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"friendTrends_icon"]];
image1.center = CGPointMake(100, 100);
[self.view addSubview:image1];
//第二种创建方式:给定图片尺寸是多大创建出来就是多大,这样图片就可能会拉伸
UIImageView *image2 = [[UIImageView alloc] init];
image2.frame = CGRectMake(100, 100, 30, 30);
image2.image = [UIImage imageNamed:@"friendTrends_icon"];
[self.view addSubview:image2];
22:按钮大小和图片大小一致( 这个前提是自己添加了那个分类才可以直接拿到size)
btn.LYW_size = [UIImage imageNamed:@"MainTagSubIcon"].size;
btn.LYW_size = [btn imageForState:UIControlStateNormal].size;
btn.LYW_size = btn.currentImage.size;
[btn sizeToFit];
23:json 字符串
我们在使用post时候不一定就是简单的字典,比如这种就是json字符串
{
"token": "0831E5A2E4734AFDB90972CC0E0AEE83" ,
"authItemInfo":{
"itemId": "17",////认证项目
//********手机认证
"cellNumber": "18620300073", //手机号
"cellPassword": "831104",//服务密码
//京东认证
"jdAccount": " jdAccount",//京东账号
"jdPassword": "jdPassword", //京东密码
"captcha": "captcha",//网站短信验证码(根据流程码process_code动态输入)
"queryPwd": "queryPwd", //查询密码(仅北京移动会出现,官网的客服密码,根据流程码process_code动态输入)
//******学历认证
"chsiAccount": " chsiAccount",//学信网账号
"chsiPassword": "chsiPassword",//学信网密码
//****身份证,工作证明
"authFiles": [
{
"fileType": 1,
"fileName": "/data/uploads/cert/2016/07/21/15/97de1236421531f37ceed4a4b1767b5c.jpg"
},
{
"fileType": 1,
"fileName": "/data/uploads/cert/2016/07/21/15/eb41c0c14ae28bc76a34b823fe6dc962.jpg"
},
{
"fileType": 1,
"fileName": "/data/uploads/cert/2016/07/21/15/e9e85f991d6fc24743147b7e45f37035.jpg"
}
]
}
}
需要这样转换后上传
NSString *url = [NSString stringWithFormat:@"%@/saveAuthItem",SDLOAN_URL];
NSDictionary *dictPlace =@{@"itemId":@"7",
@"authFiles":@[ @{@"fileName":_aliIDCardOne,@"fileType":@"1",@"position":@(1)},
@{@"fileName":_aliIDCardTwo,@"fileType":@"1",@"position":@(2)}]};
NSError *errors;
NSData *jsonDatas = [NSJSONSerialization dataWithJSONObject:dictPlace options:NSJSONWritingPrettyPrinted error:&errors];
NSString *jsonStrings = [[NSString alloc] initWithData:jsonDatas encoding:NSUTF8StringEncoding];
NSDictionary *params = @{@"token":Token,@"authItemInfo":jsonStrings};
或者如果导入了MJExtension的话,可以这样转
NSString *json = dictPlace.mj_JSONString;
另外自己可以写两个方法去转JSON字符串
//数组转JSON字符串
+ (NSString *)arrayToJSONString:(NSArray *)array
{
NSError *error = nil;
// NSMutableArray *muArray = [NSMutableArray array];
// for (NSString *userId in array) {
// [muArray addObject:[NSString stringWithFormat:@"\"%@\"", userId]];
// }
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// NSString *jsonTemp = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
// NSString *jsonResult = [jsonTemp stringByReplacingOccurrencesOfString:@" " withString:@""];
// NSLog(@"json array is: %@", jsonResult);
return jsonString;
}
//字典转JSON字符串
+ (NSString *)dictionaryToJSONString:(NSDictionary *)dictionary
{
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// NSString *jsonTemp = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
// NSString *jsonResult = [jsonTemp stringByReplacingOccurrencesOfString:@" " withString:@""];
return jsonString;
}
24:复制
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.string = @"1234567890";
25.TableView的自适应高度
#注意,这两行代码是TableView的自适应高度
_tableView.estimatedRowHeight = 100;
_tableView.rowHeight = UITableViewAutomaticDimension;
26:
一个#号在宏中的定义是“ ”双引号
两个#号的意思是拼接
27:
CFBundleShortVersionString 标识应用程序的发布版本号。这个版本号是由三个时期分割的整数组成的字符串。第一个整数代表重大修改的版本,例如实现新的功能或重大变化的修订;第二个整数表示修订,实现较突出的特点;第三个整数代表维护版本。该键的值不同于“CFBundleVersion”标识。
CFBundleVersion 标识内部版本号,可以是发布了的,也可以是还未发布的。这是一个单调增加的字符串,包括一个或多个时期分隔的整数。
28:调整UILable行间距
NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:label.text]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:20];
[attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, label.text.length)]; label.attributedText = attrString;
28:调用调用UIImagePickerController显示中文英文的问题
29:图片和字符串之间的转换
//图片转字符串
+ (NSString *)UIImageToBase64Str:(UIImage *) image
{
NSData *data = UIImageJPEGRepresentation(image, 5.0f);
NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
return encodedImageStr;
}
//字符串转图片
+ (UIImage *)Base64StrToUIImage:(NSString *)_encodedImageStr
{
NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:_encodedImageStr];
UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];
return _decodedImage;
}
类似安卓提示消息
+ (void)showMessage:(NSString *)message
{
UIWindow * window = [UIApplication sharedApplication].keyWindow;
UIView *showview = [[UIView alloc]init];
showview.backgroundColor = [UIColor blackColor];
showview.frame = CGRectMake(1, 1, 1, 1);
showview.alpha = 1.0f;
showview.layer.cornerRadius = 5.0f;
showview.layer.masksToBounds = YES;
[window addSubview:showview];
UILabel *label = [[UILabel alloc]init];
CGSize LabelSize = [message sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(320, 9000)];
label.frame = CGRectMake(10, 5, LabelSize.width, LabelSize.height);
label.text = message;
label.textColor = [UIColor whiteColor];
label.textAlignment = 1;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:15];
[showview addSubview:label];
showview.frame = CGRectMake((LYWScreenWidth - LabelSize.width - 20)/2, LYWScreenHeight - 100, LabelSize.width+20, LabelSize.height+10);
[UIView animateWithDuration:3 animations:^{
showview.alpha = 0;
} completion:^(BOOL finished) {
[showview removeFromSuperview];
}];
}
判断字符串为空
+ (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;
}
检测代码量
用命令行 先进入cd 项目 再输入以下代码
find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.h" -or -name "*.rss" ")" -print | xargs wc -l
或者使用GitHub 上别人写的一个东西
https://github.com/976971956/DEMOlineNUM
改变 UITextField 占位文字 颜色
[_userName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
禁止横屏 在Appdelegate 使用
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortrait;
}
修改状态栏颜色 (默认黑色,修改为白色)
1.在Info.plist中设置
UIViewControllerBasedStatusBarAppearance 为NO
在需要改变状态栏颜色的 AppDelegate中在 didFinishLaunchingWithOptions 方法中增加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
如果需要在单个ViewController中添加,在ViewDidLoad方法中增加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
模糊效果
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *test = [[UIVisualEffectView alloc] initWithEffect:effect];
test.frame = self.view.bounds;
test.alpha = 0.5;
[self.view addSubview:test];
前往设置
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
系统的分享
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[@"1",@"2",@"3"] applicationActivities:nil];
activityVC.view.backgroundColor = [UIColor clearColor];
activityVC.excludedActivityTypes = @[UIActivityTypePrint,UIActivityTypeAssignToContact,UIActivityTypeAddToReadingList,UIActivityTypeAirDrop];
[self presentViewController:activityVC animated:YES completion:nil];
抓包
http://www.jianshu.com/p/5539599c7a25
手机运营商
-(void)getcarrierName{
CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [telephonyInfo subscriberCellularProvider];
NSString *currentCountry=[carrier carrierName];
NSLog(@"[carrier isoCountryCode]==%@,[carrier allowsVOIP]=%d,[carrier mobileCountryCode=%@,[carrier mobileCountryCode]=%@",[carrier isoCountryCode],[carrier allowsVOIP],[carrier mobileCountryCode],[carrier mobileNetworkCode]);
NSLog(@"运营商:%@",currentCountry);
}
url中带中文
// UIWebView加载不出后台返回的url地址。是因为url中带有中文的原因,需要解码。
NSCharacterSet *set = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodedString = [self.url stringByAddingPercentEncodingWithAllowedCharacters:set];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:encodedString]]];
1.获取identifierForVendor标示手机
NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];
http://blog.csdn.net/u014220518/article/details/50509559
Xcode编译报错:
This application’s application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.
原因:两次编译的用的证书不一致。
数组去除相同元素
NSArray *dataArray = @[@"1",@"1",@"2",@"3",@"4",@"1"];
NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:dataArray.count];
// 外层一个循环
for (NSString *item in dataArray) {
// 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历
// 时间复杂度为O ( n^2 )而不是O (n)
if (![resultArray containsObject:item]) {
[resultArray addObject:item];
}
}
NSLog(@"resultArray: %@", resultArray);
数组的四种遍历方式
/// 以数组为例 实现下面4种遍历
NSArray *array = @[@"1", @"2", @"3"];
/// 遍历方式1 常规for循环
for (NSInteger i = 0; i < [array count]; i++) {
NSLog(@"%@", array[I]);
}
/// 遍历方式2 Objective-C 1.0 的NSEnumerator
NSEnumerator *enu = [array objectEnumerator];
id next = nil;
while ((next = enu.nextObject) != nil) {
// 当next为nil时 遍历结束
NSLog(@"%@", next);
}
/// 遍历方式3 Objective-C 2.0 引入的for-in
for (id obj in array) {
NSLog(@"%@", obj);
}
/// 遍历方式4 最新的块遍历
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// stop为YES时 结束遍历
if (*stop == NO) {
NSLog(@"%@", obj);
}
}];
cell的点击颜色
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// [self setupView];
[self setupCustomCellSelectedColor];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
[self setupCustomCellSelectedColor];
}
调用该方法
- (void)setupCustomCellSelectedColor
{
CGRect rect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
//高亮颜色值
UIColor *selectedColor = [UIColor redColor];
CGContextSetFillColorWithColor(context, [selectedColor CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.selectedBackgroundView = [[UIImageView alloc] initWithImage:image];
}
[iOS 11 UIScrollView的新特性(automaticallyAdjustsScrollViewInsets 不起作用了)]
解决方法
if (@available(iOS 11.0, *)) {
_scroll.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
swift自定义Log
func LYWLog<T>(_ message:T,file:String = #file,funcName:String = #function,lineNum:Int=#line) {
let fileName = (file as NSString).lastPathComponent
print("\(fileName):[\(funcName)](\(lineNum)-\(message))")
}
Error returned in reply: Connection invalid
解决方法:把Xcode 以及模拟器全部关掉 从新启动一个Xcode就好了
ERROR ITMS-90096: "Your binary is not optimized for iPhone 5 - New iPhone apps and app updates submitted must support the 4-inch display on iPhone 5 and must include a launch image referenced in the Info.plist under UILaunchImages with a UILaunchImageSize value set to {320, 568}. Launch images must be PNG files and located at the top-level of your bundle, or provided within each .lproj folder if you localize your launch images. Learn more about iPhone 5 support and app launch images by reviewing the 'iOS Human Interface Guidelines' at https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen."
特么的要是遇到这个问题,别特么听网上一大堆的解决方案,说白了就是你的启动图片不对。要么启动图片的尺寸不对,要么就是图片中不是png的图片。
关于移动硬盘无法修改资料的问题
http://www.pc6.com/mac/117369.html
图片设置圆角
//cornerRadius 设置为self.iconImage图片宽度的一半(圆形图片)
self.iconImage.layer.cornerRadius = 20;
self.iconImage.layer.masksToBounds = YES;
在此之后建议大家尽量不要这么设置, 因为使用图层过量会有卡顿现象, 特别是弄圆角或者阴影会很卡, 如果设置图片圆角我们一般用绘图来做:
- (UIImage *)cutCircleImage {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
// 获取上下文
CGContextRef ctr = UIGraphicsGetCurrentContext();
// 设置圆形
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextAddEllipseInRect(ctr, rect);
// 裁剪
CGContextClip(ctr);
// 将图片画上去
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
UILable修改行距
1.UILabel修改文字行距,首行缩进
lineSpacing: 行间距
firstLineHeadIndent:首行缩进
font: 字体
textColor: 字体颜色
- (NSDictionary *)settingAttributesWithLineSpacing:(CGFloat)lineSpacing FirstLineHeadIndent:(CGFloat)firstLineHeadIndent Font:(UIFont *)font TextColor:(UIColor *)textColor{
//分段样式
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
//行间距
paragraphStyle.lineSpacing = lineSpacing;
//首行缩进
paragraphStyle.firstLineHeadIndent = firstLineHeadIndent;
//富文本样式
NSDictionary *attributeDic = @{
NSFontAttributeName : font,
NSParagraphStyleAttributeName : paragraphStyle,
NSForegroundColorAttributeName : textColor
};
return attributeDic;
}
判断是否为gif/png图片的正确姿势
//假设这是一个网络获取的URL
NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif";
// 判断是否为gif
NSString *extensionName = path.pathExtension;
if ([extensionName.lowercaseString isEqualToString:@"gif"]) {
//是gif图片
} else {
//不是gif图片
}
以上判断看似是可以的,但是这不严谨的, 在不知道图片扩展名的情况下, 如何知道图片的真实类型 ? 其实就是取出图片数据的第一个字节, 就可以判断出图片的真实类型那该怎么做呢如下:
//通过图片Data数据第一个字节 来获取图片扩展名
- (NSString *)contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"jpeg";
case 0x89:
return @"png";
case 0x47:
return @"gif";
case 0x49:
case 0x4D:
return @"tiff";
case 0x52:
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
return @"webp";
}
return nil;
}
return nil;
}
使用 IQKeyboardManager如果你的视图有导航栏,你不想上移View时,UINavigationBar消失,你也可以进行相应设置:
如果你使用的是代码,你就需要覆盖UIViewController中的'-(void)loadView' 方法:
##添加额外代码,避免导航栏
UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.scrollEnabled = YES;
[self.view addSubview:scrollView];
#scroll.scrollEnabled = NO
如果你使用的是storyboard or xib,只需将当前视图视图控制器中的UIView class变为UIScrollView。
备注:
如果有不足或者错误的地方还望各位读者批评指正,可以评论留言,笔者收到后第一时间回复。
QQ/微信:2366889552 /lan2018yingwei。
简书号:凡尘一笑:[简书]
http://www.jianshu.com/users/0158007b8d17/latest_articles
感谢各位观众老爷的阅读,如果觉得笔者写的还凑合,可以关注或收藏一下,不定期分享一些好玩的实用的demo给大家。
文/凡尘一笑(简书作者)
原文链接: http://www.jianshu.com/p/8ae080edb3ea
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。