近期一直在忙一个im的应用 所以博客就忘记写了 ╮(╯▽╰)╭ 现在项目差不多做完了 从中也学到了一些东西 接下来就是总结提升的部分了.........恩
图片多选使用 TZImagePickerController 使用简单操作方便只需要cocopods导入 然后引入头文件即可
使用的时候写下面俩行代码 就OK了
//打开相册
-(void)openPicLibrary{
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:9 delegate:self];
[self presentViewController:imagePickerVc animated:YES completion:nil];
}
其实类似这种的第三方很多的 基本都是对系统的imagepickerController进行了封装 ,时间充足的话 我觉得还是自己写最好 毕竟便于维护嘛...
聊天的cell 用的是UUchattableView
基本上拿来就可以直接用了 里面是用frame 布局的 看下就明白了 操作方便
二维码扫描使用的是SubLBXScanViewController 拿来就可以直接使用的节奏 简单粗暴 SubLBXScanViewController 其实是基于LbxScan 一个小小的封装 LbxScan 是基于zxing zbar 基础上封装的.....(⊙o⊙)…
推送的话 这边使用的是云信自带的推送 至于APNS 那都是老生常谈了 暂且不提
中间客户提了一个奇葩的要求 要求吧拍照的时候的那个声音去掉.... 找了好半天才找到解决办法
SystemSoundID soundID;
NSString *path =[[NSBundle mainBundle]pathForResource:@"photoShutter2" ofType:@"caf"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)([NSURL fileURLWithPath:path]), &soundID);
AudioServicesCreateSystemSoundID((__bridge CFURLRef)([NSURL fileURLWithPath:path]), &soundID);
AudioServicesPlaySystemSound(soundID);
使用这个 可以实现 那个语音文件呢 其实是和系统拍照声音相反的文件 这样就中和掉了 系统拍照时候的声音 好神奇有木有...╮(╯▽╰)╭
MD5加密
CocoaSecurityResult *result = [CocoaSecurity md5:str];
return result.hexLower;
CocoaSecurity 这个是加密要使用到的一个库.使用这个做MD5加密 简单粗暴
/**
* 返回时间str,当有一个str或时间戳或NSDate的时间格式时(三选一),可以得到指订输出格式的时间字符串
*
* @param inFormate 输入时间格式,可选
* @param outFormate 输出时间格式,可选
* @param date 输入时间为str,可选
* @param shijianchuo 输入时间为时间戳,可选
* @param dateTwo 输入时间为NSDate,可选
*
* @return 时间str
*/
- (NSString *)changeDateStrToDateStrWithInDateFormate:(NSString *)inFormate withOutFormate:(NSString *)outFormate withDateStr:(NSString *)date withShiJianChuoStr:(NSString *)shijianchuo withDate:(NSDate *)dateTwo;
- (NSString *)changeDateStrToDateStrWithInDateFormate:(NSString *)inFormate withOutFormate:(NSString *)outFormate withDateStr:(NSString *)date withShiJianChuoStr:(NSString *)shijianchuo withDate:(NSDate *)dateTwo{
if (_dateFormatter == nil) {
_dateFormatter = [[NSDateFormatter alloc]init];
}
if (!inFormate) {
[_dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
}else{
[_dateFormatter setDateFormat:inFormate];
}
NSDate* inputDate = nil;
if (shijianchuo) {
inputDate = [NSDate dateWithTimeIntervalSince1970:[shijianchuo doubleValue]];
}else if (date) {
inputDate = [_dateFormatter dateFromString:date];
}else if (dateTwo){
inputDate = dateTwo;
}
if (!inputDate) {
return @"暂无时间";
}
if (!outFormate) {
[_dateFormatter setDateFormat:@"yyyy-MM-dd"];
}else {
[_dateFormatter setDateFormat:outFormate];
}
if ([outFormate rangeOfString:@"eeee"].length > 0) {
[_dateFormatter setWeekdaySymbols:@[@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六"]];
}
NSString *dateStr = nil;
dateStr = [_dateFormatter stringFromDate:inputDate];
return dateStr;
}
调用代码使APP进入后台,达到点击Home键的效果。(私有API)
带有中文的URL处理
NSString *path = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)model.mp4_url,
CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
获取UIWebView的高度
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
CGRect frame = webView.frame;
webView.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, height);
}
给UIView设置图片(UILabel一样适用)
UIImage *image = [UIImage imageNamed:@"yourPicName@2x.png"];
yourView.layer.contents = (__bridge id)image.CGImage;
//设置显示的图片范围
yourView.layer.contentsCenter = CGRectMake(0.25,0.25,0.5,0.5);//四个值在0-1之间,对应的为x,y,width,height。
调整cell分割线的位置,两个方法一起用,暴力解决
-(void)viewDidLayoutSubviews {
if ([self.mytableview respondsToSelector:@selector(setSeparatorInset:)]) {
[self.mytableview setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}
if ([self.mytableview respondsToSelector:@selector(setLayoutMargins:)]) {
[self.mytableview setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];
}
}
#pragma mark - cell分割线
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];
}
}
UISearchController和UISearchBar的Cancle按钮改title问题,简单粗暴
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
searchController.searchBar.showsCancelButton = YES;
UIButton *canceLBtn = [searchController.searchBar valueForKey:@"cancelButton"];
[canceLBtn setTitle:@"取消" forState:UIControlStateNormal];
[canceLBtn setTitleColor:[UIColor colorWithRed:14.0/255.0 green:180.0/255.0 blue:0.0/255.0 alpha:1.00] forState:UIControlStateNormal];
searchBar.showsCancelButton = YES;
return YES;
}
UITableView收起键盘
yourTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
另外一个枚举为UIScrollViewKeyboardDismissModeInteractive,表示在键盘内部滑动,键盘逐渐下去。
NSTimer
1、NSTimer计算的时间并不精确
2、NSTimer需要添加到runLoop运行才会执行,但是这个runLoop的线程必须是已经开启。
3、NSTimer会对它的tagert进行retain,我们必须对其重复性的使用intvailte停止。target如果是self(指UIViewController),那么VC的retainCount+1,如果你不释放NSTimer,那么你的VC就不会dealloc了,内存泄漏了。
用十六进制获取UIColor
+ (UIColor *)colorWithHexString:(NSString *)color
{
NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
// String should be 6 or 8 characters
if ([cString length] < 6) {
return [UIColor clearColor];
}
// strip 0X if it appears
if ([cString hasPrefix:@"0X"])
cString = [cString substringFromIndex:2];
if ([cString hasPrefix:@"#"])
cString = [cString substringFromIndex:1];
if ([cString length] != 6)
return [UIColor clearColor];
// Separate into r, g, b substrings
NSRange range;
range.location = 0;
range.length = 2;
//r
NSString *rString = [cString substringWithRange:range];
//g
range.location = 2;
NSString *gString = [cString substringWithRange:range];
//b
range.location = 4;
NSString *bString = [cString substringWithRange:range];
// Scan values
unsigned int r, g, b;
[[NSScanner scannerWithString:rString] scanHexInt:&r];
[[NSScanner scannerWithString:gString] scanHexInt:&g];
[[NSScanner scannerWithString:bString] scanHexInt:&b];
return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f];
}
获取今天是星期几
+ (NSString *) getweekDayStringWithDate:(NSDate *) date
{
NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 指定日历的算法
NSDateComponents *comps = [calendar components:NSWeekdayCalendarUnit fromDate:date];
// 1 是周日,2是周一 3.以此类推
NSNumber * weekNumber = @([comps weekday]);
NSInteger weekInt = [weekNumber integerValue];
NSString *weekDayString = @"(周一)";
switch (weekInt) {
case 1:
{
weekDayString = @"(周日)";
}
break;
case 2:
{
weekDayString = @"(周一)";
}
break;
case 3:
{
weekDayString = @"(周二)";
}
break;
case 4:
{
weekDayString = @"(周三)";
}
break;
case 5:
{
weekDayString = @"(周四)";
}
break;
case 6:
{
weekDayString = @"(周五)";
}
break;
case 7:
{
weekDayString = @"(周六)";
}
break;
default:
break;
}
return weekDayString;
}
UIView的部分圆角问题
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)];
view2.backgroundColor = [UIColor redColor];
[self.view addSubview:view2];
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view2.bounds;
maskLayer.path = maskPath.CGPath;
view2.layer.mask = maskLayer;
//其中,
byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
//指定了需要成为圆角的角。该参数是UIRectCorner类型的,可选的值有:
* UIRectCornerTopLeft
* UIRectCornerTopRight
* UIRectCornerBottomLeft
* UIRectCornerBottomRight
* UIRectCornerAllCorners
设置滑动的时候隐藏navigationBar
记得先 QuartzCore框架的导入
#import <QuartzCore/QuartzCore.h>
CGContextRef context =UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
CGFloat lengths[] = {10,10};
CGContextSetLineDash(context, 0, lengths,2);
CGContextMoveToPoint(context, 10.0, 20.0);
CGContextAddLineToPoint(context, 310.0,20.0);
CGContextStrokePath(context);
CGContextClosePath(context);
禁止程序运行时自动锁屏
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
NSArray 快速求总和 最大值 最小值 和 平均值 (利用KVC)
NSArray *array = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", @"10", nil];
CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
NSLog(@"%f\n%f\n%f\n%f",sum,avg,max,min);
使用MBProgressHud时,尽量不要加到UIWindow上,加self.view上即可。如果加UIWindow上在iPad上,旋转屏幕的时候MBProgressHud不会旋转
强制让App直接退出(非闪退,非崩溃)
Label行间距
把tableview里cell的小对勾的颜色改成别的颜色
_yourTableView.tintColor = [UIColor redColor];
、解决同时按两个按钮进两个view的问题
[button setExclusiveTouch:YES];
修改textFieldplaceholder字体颜色和大小
禁止textField和textView的复制粘贴菜单
要做的是新建一个类MyTextField继承UITextField,然后在MyTextField的.m文件里重写这个方法,就可以单独控制某个输入框了。
如何进入我的软件在app store 的页面
先用iTunes Link Maker找到软件在访问地址,格式为itms-apps://ax.itunes.apple.com/…,然后
二级三级页面隐藏系统tabbar
1、单个处理
2.统一在基类里面处理
新建一个类BaseNavigationController继承UINavigationController,然后重写 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated这个方法。所有的push事件都走此方法。
取消系统的返回手势
修改UIWebView中字体的大小,颜色
1、UIWebView设置字体大小,颜色,字体:
UIWebView无法通过自身的属性设置字体的一些属性,只能通过html代码进行设置
在webView加载完毕后,在
或者加入以下代码
NSString处理技巧
使用场景举例:可以用在处理用户用户输入在UITextField的文本
主线程操作UI(对UI进行更新只能在主线程进行)
解释:所谓的在主线程更新UI、操作UI,大致的意思就是设置UILabel的text或者设置tabbar的badgeValue,设置UIImageView的image等等。
回到主线程方式1:
performSelectorOnMainThread方法是NSObject的分类方法,每个NSObject对象都有此方法,
它调用的selector方法是当前调用控件的方法,例如使用UIImageView调用的时候selector就是UIImageView的方法
Object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装)
waitUntilDone:是否线程任务完成执行
回到主线程方式2:
这个不多解释,GCD的方法,注意不要在主线程掉用。
判断模拟器
真机测试报 TCWeiboSDK 93 duplicate symbols for architecture armv7
这是因为在项目中引用的两个相同的类库引起了,在我的项目中是因为引入的两个不同指令集引起的;
FnetWorking报”Request failed: unacceptable content-type: text/html”错误
AFURLResponseSerialization.m文件设置
隐藏navigation跳转后的返回按钮
两种方法删除NSUserDefaults所有记录
NSLog 输出格式集合
常用GCD总结
为了方便地使用GCD,苹果提供了一些方法方便我们将block放在主线程 或 后台线程执行,或者延后执行。使用的例子如下:
dispatch_queue_t 也可以自己定义,如要要自定义queue,可以用dispatch_queue_create方法,示例如下:
另外,GCD还有一些高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。这个可以用dispatch_group, dispatch_group_async 和 dispatch_group_notify来实现,示例如下:
sKindOfClass, isMemberOfClass的用法区分
-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
实例一:
实例二:
isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管,所以isMemberOfClass指到父类时才会为NO;
关于UIScreen
UIScreen对象包含了整个屏幕的边界矩形。当构造应用的用户界面接口时,你应该使用该对象的属性来获得推荐的矩形大小,用以构造你的程序窗口。
CGRect bound = [[UIScreen mainScreen] bounds]; // 返回的是带有状态栏的Rect
CGRect frame = [[UIScreen mainScreen] applicationFrame]; // 返回的是不带有状态栏的Rect
float scale = [[UIScreen mainScreen] scale]; // 得到设备的自然分辨率
对于scale属性需要做进一步的说明:
以前的iphone 设备屏幕分辨率都是320*480,后来apple 在iPhone 4中采用了名为Retina的显示技术,iPhone 4采用了960x640像素分辨率的显示屏幕。由于屏幕大小没有变,还是3.5英寸,分辨率的提升将iPhone 4的显示分辨率提升至iPhone 3GS的四倍,每英寸的面积里有326个像素。
scale属性的值有两个:
scale = 1; 的时候是代表当前设备是320*480的分辨率(就是iphone4之前的设备)
scale = 2; 的时候是代表分辨率为640*960的分辨率
百度坐标跟火星坐标相互转换
绘制1像素的线
UILabel显示HTML文本(IOS7以上)
关于Masonry
中文输入法的键盘上有联想、推荐的功能,所以可能导致文本内容长度上有些不符合预期,导致越界
* Terminating app due to uncaught exception ‘NSRangeException’, reason: ‘NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds’
处理方式如下(textView.markedTextRange == nil)
关于导航栏透明度的设置及顶部布局起点位置设置
属性:translucent
关闭
self.navigationController.navigationBar.translucent = NO;
开启
self.navigationController.navigationBar.translucent = YES;
属性:automaticallyAdjustsScrollViewInsets
当 automaticallyAdjustsScrollViewInsets 为 NO 时,tableview 是从屏幕的最上边开始,也就是被 导航栏 & 状态栏覆盖
当 automaticallyAdjustsScrollViewInsets 为 YES 时,也是默认行为
UIScrollView偏移64问题
UIScrollView偏移64问题在一个VC里如果第一个控件是UIScrollView,注意是第一个控件,就是首先addsubview在VC.view上。接着加到scrollView上的View就会在Y点上发生64的偏移(也就是navigationBar的高度44+电池条的高度20)。
这个在iOS7以后才会出现。
解决办法:
self.automaticallyAdjustsScrollViewInsets = false; self是你当前那个VC。
如果这个scrollView不是第一个加到self.view上的。也不会发生64的偏移。
UIWebView在IOS9下底部出现黑边解决方式
UIWebView底部的黑条很难看(在IOS8下不会,在IOS9会出现),特别是在底部还有透明控件的时候,隐藏的做法其实很简单,只需要将opaque设为NO,背景色设为clearColor即可
tabBarController跳转到另一个一级页面
当我们用tabBarController时,若已经到其中一个TabBar的子页,又要跳转到某一个一级的页面时,如果这样写,导致底部出现黑边,引起tabbar消失的bug
解决方法一:删除动画
解决方法二:延迟执行另一个系统操作
汉字转为拼音
属性名以new开头解决方式
因为new为OC关键词,类似的还有alloc
@property (nonatomic,copy) NSString *new_Passwd;
像上面这样写法会报错,可以替换成
@property (nonatomic,copy,getter = theNewPasswd) NSString *new_Passwd;
去除编译器警告
a:方法弃用告警
b:未使用变量
数组逆序遍历
1、枚举法
2、for循环