iOS杂碎2

AVAudio 参考

1.1 AVAudioSessionCategory 几个选项参考:

AVAudioSessionCategoryAmbient 只用于播放音乐时,并且可以和QQ音乐同时播放,比如玩游戏的时候还想听QQ音乐的歌,那么把游戏播放背景音就设置成这种类别。同时,当用户锁屏或者静音时也会随着静音,这种类别基本使用所有App的背景场景。

AVAudioSessionCategorySoloAmbient 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就别想听QQ音乐了,比如不希望QQ音乐干扰的App,类似节奏大师。同样当用户锁屏或者静音时也会随着静音,锁屏了就玩不了节奏大师了。

AVAudioSessionCategoryPlayback 如果锁屏了还想听声音怎么办?用这个类别,比如App本身就是播放器,同时当App播放时,其他类似QQ音乐就不能播放了。所以这种类别一般用于播放器类App

AVAudioSessionCategoryRecord 有了播放器,肯定要录音机,比如微信语音的录制,就要用到这个类别,既然要安静的录音,肯定不希望有QQ音乐了,所以其他播放声音会中断。想想微信语音的场景,就知道什么时候用他了。

AVAudioSessionCategoryPlayAndRecord如果既想播放又想录制该用什么模式呢?比如VoIP,打电话这种场景,PlayAndRecord就是专门为这样的场景设计的 。

AVAudioSessionCategoryMultiRoute想象一个DJ用的App,手机连着HDMI到扬声器播放当前的音乐,然后耳机里面播放下一曲,这种常人不理解的场景,这个类别可以支持多个设备输入输出。

AVAudioSessionCategoryAudioProcessing主要用于音频格式处理,一般可以配合AudioUnit进行使用
更多详见

通过设置activeYES激活Session,设置为NO解除Session的激活状态。BOOL返回值表示是否成功,如果失败的话可以通过NSErrorerror.localizedDescription查看出错原因。

- (BOOL)setActive:(BOOL)active  error:(NSError * _Nullable *)outError;

注意: 因为AVAudioSession会影响其他App的表现,当自己App的Session被激活,其他App的就会被解除激活,如何要让自己的Session解除激活后恢复其他App Session的激活状态呢?

- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError * _Nullable *)outError;

这里的options传入 AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation 即可。 当然,也可以通过otherAudioPlaying变量来提前判断当前是否有其他App在播放音频。

2.1 AVAudioSessionMode

AVAudioSessionModeDefault 每种类别默认的就是这个模式,所有要想还原的话,就设置成这个模式。

AVAudioSessionModeVoiceChat主要用于VoIP场景,此时系统会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集。此时有个副作用,他会设置类别的选项为AVAudioSessionCategoryOptionAllowBluetooth从而支持蓝牙耳机。

AVAudioSessionModeVideoChat 主要用于视频通话,比如QQ视频、FaceTime。时系统也会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集并且会设置类别的选项为

AVAudioSessionCategoryOptionAllowBluetoothAVAudioSessionCategoryOptionDefaultToSpeaker
AVAudioSessionModeGameChat 适用于游戏App的采集和播放,比如“GKVoiceChat”对象,一般不需要手动设置

坐标转换

/// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
 
/// 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
 
/// 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
 
/// 将rect从view中转换到当前视图中,返回在当前视图中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

plist文件转json文件

plutil -convert json name.plist -o name.json

Label文字后面添加图片

NSTextAttachment *attch = [[NSTextAttachment alloc] init];
attch.image = [UIImage imageNamed:@"imagename"];
attch.bounds = CGRectMake(10, -1, 7, 12);
NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];
            
NSString *text = targetPlan.title;
NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:text];
[attri addAttribute:NSForegroundColorAttributeName value:RGBA(74,74,91,1) range:NSMakeRange(0, attri.length)];
[attri addAttribute:NSFontAttributeName value:PingFangRegularFont(15) range:NSMakeRange(0, attri.length)];
 [attri insertAttributedString:string atIndex:text.length];
self.titleLabel.attributedText = attri;

OC注入JS失败

错误描述:

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=ReferenceError: Can't find variable: web, WKJavaScriptExceptionColumnNumber=4, WKJavaScriptExceptionSourceURL=about:blank, NSLocalizedDescription=A JavaScript exception occurred}

错误原因: 数组转json字符串时options选成NSJSONWritingPrettyPrinted 而不是kNilOptions导致,下面是正确的注入方法:

// 数组转化成JSON字符串
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:kNilOptions error:nil];
NSString *paraStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *method = [NSString stringWithFormat:@"%@('%@')", @"web.getSmallWeightDate", paraStr];
[webView evaluateJavaScript:method completionHandler:^(id _Nullable response, NSError * _Nullable error) {
}];

修改textView或者textField 光标的大小

继承自UITextView 重写父类方法


@implementation CustomTextView

- (CGRect)caretRectForPosition:(UITextPosition *)position {
    
    CGRect originalRect = [super caretRectForPosition:position];
    originalRect.size.height = self.font.lineHeight - 8;
    originalRect.size.width = 2;
    return originalRect;
}

@end

NSPredicate用法之一: 数组元素为对象时,通过对象的某个属性快速筛选出数组中的对象

// 找出tips和年报的模型
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == 1001 OR type == 1002"];
NSArray *temp = [self.dataArray filteredArrayUsingPredicate:predicate];
if (temp.count > 0) {
   _hasTips = YES;
} else {
    _hasTips = NO;
}

关于NSPredicate更多高级用法,参见:iOS NSPredicate 使用详解
iOS中的谓词(NSPredicate)使用

SD图片加载渐现效果

[_ImageView sd_setImageWithURL:url placeholderImage:placeholderImage options:YYWebImageOptionAllowBackgroundTask progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
    dispatch_sync(dispatch_get_main_queue(), ^(){
       [weakSelf fadeLayer:weakSelf.ImageView.layer];
    });
} completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
}];

- (void)fadeLayer:(CALayer *)layer {
    CATransition *transition = [CATransition animation];
    transition.duration = 0.5;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;
    [layer addAnimation:transition forKey:@"fade"];
}

使用pandoc为markdown生成大纲

pandoc 2.5
Compiled with pandoc-types 1.17.5.4, texmath 0.11.1.2, skylighting 0.7.4
Default user data directory: /Users/wanghaobing/.pandoc
Copyright (C) 2006-2018 John MacFarlane
Web:  http://pandoc.org
  • 3.cd到存放.md文件的文件夹目录
    1. 输入pandoc -s --toc README.md -o README.md命令,即可自动生成目录 (使用该命令默认生成三级目录)
      如果想要生成4级目录,可以使用pandoc -s --toc --toc-depth=4 README.md -o README.md命令 (README.md可以修改为你的markdown文件名)

WKWebView头部添加自定义View, 随Webview一起滚动

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight) configuration:configuration];
webView.navigationDelegate = self;
webView.multipleTouchEnabled = YES;
webView.userInteractionEnabled = YES;
webView.contentMode = UIViewContentModeScaleAspectFit;
webView.scrollView.scrollEnabled = YES;
webView.scrollView.delegate = self;
        
// 调整contentInset,将自定义视图添加到webView.scrollView
webView.scrollView.contentInset = UIEdgeInsetsMake(ScreenWidth, 0, 0, 0);

CustomView *customView = [[CustomView alloc] initWithFrame:CGRectMake(0, -ScreenWidth, ScreenWidth, ScreenWidth)]; //注意y值.
[webView.scrollView addSubview: customView];

[self.view addSubview:webView];

获取当天,当周,当月,当年的时间区间

double interval = 0;
NSDate *beginDate = nil;
NSDate *endDate = nil;
    
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:2];//设定周一为周首日
BOOL exist = [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&beginDate interval:&interval forDate:[NSDate date]];
// unit可分别修改为 NSCalendarUnitDay NSCalendarUnitWeekOfYear NSCalendarUnitMonth NSCalendarUnitYear
if (exist) {
   endDate = [beginDate dateByAddingTimeInterval:interval-1];
}else {
   return [NSArray array];
}
NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
[myDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *beginString = [myDateFormatter stringFromDate:beginDate];
NSString *endString = [myDateFormatter stringFromDate:endDate];
    
NSString *section = [NSString stringWithFormat:@"%@ ~ %@",beginString,endString];
NSLog(@"%@",section); // 2018-11-12 00:00:00 ~ 2018-11-18 23:59:59

当然,将上述方法中的 rangeOfUnit 替换为:

  • NSCalendarUnitDay可以获取当天的时间区间 2018-11-12 00:00:00 ~ 2018-11-12 23:59:59
  • NSCalendarUnitWeekOfYear可以获取当周的时间区间 2018-11-12 00:00:00 ~ 2018-11-18 23:59:59
  • NSCalendarUnitMonth 可以获取当月的时间区间 2018-11-01 00:00:00 ~ 2018-11-30 23:59:59
  • NSCalendarUnitYear可以获取当年的时间区间 2018-01-01 00:00:00 ~ 2018-12-31 23:59:59

iOS 11以后系统相册选取完图片编辑页面,取消按钮很难被点击到的问题解决办法

#pragma mark - Navigation Controller Delegate
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([UIDevice currentDevice].systemVersion.floatValue < 11) {
        return;
    } if ([viewController isKindOfClass:NSClassFromString(@"PUPhotoPickerHostViewController")]) {
        [viewController.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            // iOS 11之后,图片编辑界面最上层会出现一个宽度<42的view,会遮盖住左下方的cancel按钮,使cancel按钮很难被点击到,故改变该view的层级结构
            if (obj.frame.size.width < 42) {
                [viewController.view sendSubviewToBack:obj];
                *stop = YES;
            }
        }];
    }
}

创建一个可任意伸缩的图片

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
  • 这是 UIImage 的一个实例方法,它的功能是创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是左边不拉伸区域的宽度,第二个参数是上面不拉伸的高度。根据设置的宽度和高度,将接下来的一个像素进行左右扩展和上下拉伸。

  • 注意:可拉伸的范围都是距离leftCapWidth后的1竖排像素,和距离topCapHeight后的1横排像素

如何忽略UserInterfaceState.xcuserstate文件

首先说说它的作用:UserInterfaceState.xcuserstate是Xcode中保存的用户操作的GUI状态,如窗口位置,打开的标签页,在项目检查等展开的节点、 简单地调整大小的Xcode窗口将这个文件来改变和修改您的源代码控制系统进行标记。每个开发者此文件都会是modify状态,为了避免多个开发者的冲突那么我们最好ignore它为好!
第一步:cd 到你的工程主目录
第二步:git rm --cache */UserInterfaceState.xcuserstate
第三步:git commit -m "Never see you again, UserInterfaceState"
然后去管理工具中选中列出的untrack文件,igonre它,最后再push一下。
使用git时如何忽略UserInterfaceState.xcuserstate文件

Article list

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容