iOS雜碎2

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è)置activeYES激活Session席函,設(shè)置為NO解除Session的激活狀態(tài)。BOOL返回值表示是否成功冈涧,如果失敗的話可以通過NSErrorerror.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)為

AVAudioSessionCategoryOptionAllowBluetoothAVAudioSessionCategoryOptionDefaultToSpeaker
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 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命令肪虎,即可自動(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锨并,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子睬棚,更是在濱河造成了極大的恐慌第煮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抑党,死亡現(xiàn)場(chǎng)離奇詭異包警,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)底靠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門害晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暑中,你說我怎么就攤上這事壹瘟■杲耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵稻轨,是天一觀的道長(zhǎng)灵莲。 經(jīng)常有香客問我,道長(zhǎng)殴俱,這世上最難降的妖魔是什么政冻? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮线欲,結(jié)果婚禮上赠幕,老公的妹妹穿的比我還像新娘。我一直安慰自己询筏,他們只是感情好榕堰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫌套,像睡著了一般逆屡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踱讨,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天魏蔗,我揣著相機(jī)與錄音,去河邊找鬼痹筛。 笑死莺治,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帚稠。 我是一名探鬼主播谣旁,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼滋早!你這毒婦竟也來了榄审?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤杆麸,失蹤者是張志新(化名)和其女友劉穎搁进,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔头,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饼问,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭斧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莱革。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驮吱,到底是詐尸還是另有隱情,我是刑警寧澤萧吠,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布左冬,位于F島的核電站,受9級(jí)特大地震影響纸型,放射性物質(zhì)發(fā)生泄漏拇砰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一狰腌、第九天 我趴在偏房一處隱蔽的房頂上張望除破。 院中可真熱鬧,春花似錦琼腔、人聲如沸瑰枫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)光坝。三九已至,卻和暖如春甥材,著一層夾襖步出監(jiān)牢的瞬間盯另,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工洲赵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸳惯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓叠萍,卻偏偏與公主長(zhǎng)得像芝发,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苛谷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 硬派健身 摘要 自序 與更好的自己后德,在未來重逢。 2016-10-11 13:34:10 是誰(shuí)說運(yùn)動(dòng)一定要持續(xù)40...
    夜上海灘閱讀 10,004評(píng)論 0 50
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,957評(píng)論 6 13
  • 最近,相信大家都從各大新聞上可以看到我們中國(guó)的傳統(tǒng)節(jié)氣“立秋”已到了赫蛇。正所謂秋高氣爽绵患,在這個(gè)時(shí)候正當(dāng)是游山玩水的好...
    李想家閱讀 438評(píng)論 0 0
  • 張藝謀導(dǎo)演的《影》最近出了新的預(yù)告片,攝影出身的張導(dǎo)在色彩和畫面上從來都是獨(dú)樹一幟筏勒,這次黑白分明的水墨風(fēng)也是讓人眼...
    王小民的吐槽閱讀 440評(píng)論 1 2
  • “群里咋沒有動(dòng)靜呢”移迫? 我手機(jī)里有三個(gè)大群:親戚群,同學(xué)群管行,戰(zhàn)友群厨埋。最近幾篇文章“咣當(dāng)”砸進(jìn)去沒了波浪,發(fā)個(gè)笑話還...
    倪郭閱讀 915評(píng)論 15 33