AVAudio 參考
1.1 AVAudioSessionCategory
幾個(gè)選項(xiàng)參考:
AVAudioSessionCategoryAmbient
只用于播放音樂時(shí)姆涩,并且可以和QQ音樂同時(shí)播放,比如玩游戲的時(shí)候還想聽QQ音樂的歌,那么把游戲播放背景音就設(shè)置成這種類別。同時(shí)促王,當(dāng)用戶鎖屏或者靜音時(shí)也會(huì)隨著靜音碌奉,這種類別基本使用所有App的背景場(chǎng)景劝贸。
AVAudioSessionCategorySoloAmbient
也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就別想聽QQ音樂了康谆,比如不希望QQ音樂干擾的App领斥,類似節(jié)奏大師。同樣當(dāng)用戶鎖屏或者靜音時(shí)也會(huì)隨著靜音沃暗,鎖屏了就玩不了節(jié)奏大師了月洛。
AVAudioSessionCategoryPlayback
如果鎖屏了還想聽聲音怎么辦?用這個(gè)類別孽锥,比如App本身就是播放器嚼黔,同時(shí)當(dāng)App播放時(shí),其他類似QQ音樂就不能播放了惜辑。所以這種類別一般用于播放器類App
AVAudioSessionCategoryRecord
有了播放器唬涧,肯定要錄音機(jī),比如微信語(yǔ)音的錄制盛撑,就要用到這個(gè)類別碎节,既然要安靜的錄音,肯定不希望有QQ音樂了抵卫,所以其他播放聲音會(huì)中斷狮荔。想想微信語(yǔ)音的場(chǎng)景胎撇,就知道什么時(shí)候用他了。
AVAudioSessionCategoryPlayAndRecord
如果既想播放又想錄制該用什么模式呢殖氏?比如VoIP创坞,打電話這種場(chǎng)景,PlayAndRecord就是專門為這樣的場(chǎng)景設(shè)計(jì)的 受葛。
AVAudioSessionCategoryMultiRoute
想象一個(gè)DJ用的App题涨,手機(jī)連著HDMI到揚(yáng)聲器播放當(dāng)前的音樂,然后耳機(jī)里面播放下一曲总滩,這種常人不理解的場(chǎng)景纲堵,這個(gè)類別可以支持多個(gè)設(shè)備輸入輸出。
AVAudioSessionCategoryAudioProcessing
主要用于音頻格式處理闰渔,一般可以配合AudioUnit進(jìn)行使用
更多詳見
通過設(shè)置active
為YES
激活Session
席函,設(shè)置為NO
解除Session
的激活狀態(tài)。BOOL返回值表示是否成功冈涧,如果失敗的話可以通過NSError
的error.localizedDescription
查看出錯(cuò)原因茂附。
- (BOOL)setActive:(BOOL)active error:(NSError * _Nullable *)outError;
注意: 因?yàn)?code>AVAudioSession會(huì)影響其他App的表現(xiàn),當(dāng)自己App的
Session
被激活督弓,其他App的就會(huì)被解除激活营曼,如何要讓自己的Session
解除激活后恢復(fù)其他App Session的激活狀態(tài)呢?
- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError * _Nullable *)outError;
這里的options傳入 AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
即可愚隧。 當(dāng)然蒂阱,也可以通過otherAudioPlaying
變量來提前判斷當(dāng)前是否有其他App在播放音頻。
2.1 AVAudioSessionMode
AVAudioSessionModeDefault
每種類別默認(rèn)的就是這個(gè)模式狂塘,所有要想還原的話录煤,就設(shè)置成這個(gè)模式。
AVAudioSessionModeVoiceChat
主要用于VoIP場(chǎng)景荞胡,此時(shí)系統(tǒng)會(huì)選擇最佳的輸入設(shè)備妈踊,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集。此時(shí)有個(gè)副作用泪漂,他會(huì)設(shè)置類別的選項(xiàng)為AVAudioSessionCategoryOptionAllowBluetooth
從而支持藍(lán)牙耳機(jī)廊营。
AVAudioSessionModeVideoChat
主要用于視頻通話,比如QQ視頻窖梁、FaceTime赘风。時(shí)系統(tǒng)也會(huì)選擇最佳的輸入設(shè)備夹囚,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集并且會(huì)設(shè)置類別的選項(xiàng)為
AVAudioSessionCategoryOptionAllowBluetooth
和 AVAudioSessionCategoryOptionDefaultToSpeaker
AVAudioSessionModeGameChat
適用于游戲App的采集和播放纵刘,比如“GKVoiceChat”對(duì)象,一般不需要手動(dòng)設(shè)置
坐標(biāo)轉(zhuǎn)換
/// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中荸哟,返回在目標(biāo)視圖view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
/// 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中假哎,返回在當(dāng)前視圖中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
/// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中瞬捕,返回在目標(biāo)視圖view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
/// 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
plist文件轉(zhuǎn)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失敗
錯(cuò)誤描述:
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}
錯(cuò)誤原因: 數(shù)組轉(zhuǎn)json字符串時(shí)options選成NSJSONWritingPrettyPrinted
而不是kNilOptions
導(dǎo)致,下面是正確的注入方法:
// 數(shù)組轉(zhuǎn)化成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 光標(biāo)的大小
繼承自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用法之一: 數(shù)組元素為對(duì)象時(shí),通過對(duì)象的某個(gè)屬性快速篩選出數(shù)組中的對(duì)象
// 找出tips和年報(bào)的模型
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == 1001 OR type == 1002"];
NSArray *temp = [self.dataArray filteredArrayUsingPredicate:predicate];
if (temp.count > 0) {
_hasTips = YES;
} else {
_hasTips = NO;
}
關(guān)于NSPredicate更多高級(jí)用法,參見:iOS NSPredicate 使用詳解
iOS中的謂詞(NSPredicate)使用
SD圖片加載漸現(xiàn)效果
[_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
下載地址https://github.com/jgm/pandoc/releases
Mac系統(tǒng)直接下載pandoc-2.5-macOS.pkg雙擊安裝即可
- 下載和安裝pandoc
- 打開終端舵抹,輸入
pandoc --version
確認(rèn) pandoc 已成功安裝
- 打開終端舵抹,輸入
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
文件的文件夾目錄 - 輸入
pandoc -s --toc README.md -o README.md
命令肪虎,即可自動(dòng)生成目錄 (使用該命令默認(rèn)生成三級(jí)目錄)
如果想要生成4級(jí)目錄,可以使用pandoc -s --toc --toc-depth=4 README.md -o README.md
命令 (README.md可以修改為你的markdown文件名)
- 輸入
WKWebView頭部添加自定義View, 隨Webview一起滾動(dòng)
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;
// 調(diào)整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];
獲取當(dāng)天,當(dāng)周,當(dāng)月,當(dāng)年的時(shí)間區(qū)間
double interval = 0;
NSDate *beginDate = nil;
NSDate *endDate = nil;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:2];//設(shè)定周一為周首日
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
當(dāng)然,將上述方法中的 rangeOfUnit
替換為:
-
NSCalendarUnitDay
可以獲取當(dāng)天的時(shí)間區(qū)間2018-11-12 00:00:00 ~ 2018-11-12 23:59:59
-
NSCalendarUnitWeekOfYear
可以獲取當(dāng)周的時(shí)間區(qū)間2018-11-12 00:00:00 ~ 2018-11-18 23:59:59
-
NSCalendarUnitMonth
可以獲取當(dāng)月的時(shí)間區(qū)間2018-11-01 00:00:00 ~ 2018-11-30 23:59:59
-
NSCalendarUnitYear
可以獲取當(dāng)年的時(shí)間區(qū)間2018-01-01 00:00:00 ~ 2018-12-31 23:59:59
iOS 11以后系統(tǒng)相冊(cè)選取完圖片編輯頁(yè)面,取消按鈕很難被點(diǎn)擊到的問題解決辦法
#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之后,圖片編輯界面最上層會(huì)出現(xiàn)一個(gè)寬度<42的view惧蛹,會(huì)遮蓋住左下方的cancel按鈕扇救,使cancel按鈕很難被點(diǎn)擊到,故改變?cè)搗iew的層級(jí)結(jié)構(gòu)
if (obj.frame.size.width < 42) {
[viewController.view sendSubviewToBack:obj];
*stop = YES;
}
}];
}
}
創(chuàng)建一個(gè)可任意伸縮的圖片
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
這是 UIImage 的一個(gè)實(shí)例方法香嗓,它的功能是創(chuàng)建一個(gè)內(nèi)容可拉伸迅腔,而邊角不拉伸的圖片,需要兩個(gè)參數(shù)靠娱,第一個(gè)是左邊不拉伸區(qū)域的寬度沧烈,第二個(gè)參數(shù)是上面不拉伸的高度。根據(jù)設(shè)置的寬度和高度像云,將接下來的一個(gè)像素進(jìn)行左右擴(kuò)展和上下拉伸锌雀。
注意:可拉伸的范圍都是距離leftCapWidth后的1豎排像素,和距離topCapHeight后的1橫排像素
如何忽略UserInterfaceState.xcuserstate文件
首先說說它的作用:UserInterfaceState.xcuserstate是Xcode中保存的用戶操作的GUI狀態(tài)迅诬,如窗口位置腋逆,打開的標(biāo)簽頁(yè),在項(xiàng)目檢查等展開的節(jié)點(diǎn)侈贷、 簡(jiǎn)單地調(diào)整大小的Xcode窗口將這個(gè)文件來改變和修改您的源代碼控制系統(tǒng)進(jìn)行標(biāo)記闲礼。每個(gè)開發(fā)者此文件都會(huì)是modify狀態(tài),為了避免多個(gè)開發(fā)者的沖突那么我們最好ignore它為好铐维!
第一步:cd 到你的工程主目錄
第二步:git rm --cache */UserInterfaceState.xcuserstate
第三步:git commit -m "Never see you again, UserInterfaceState"
然后去管理工具中選中列出的untrack文件柬泽,igonre它,最后再push一下嫁蛇。
使用git時(shí)如何忽略UserInterfaceState.xcuserstate文件
Article list