主要記錄一些在平時(shí)開發(fā)中用到的一些小知識(shí)點(diǎn)
1袖裕、tableViewCell初始化時(shí)默認(rèn)的寬度為320(可能是遺留的bug),所以實(shí)際布局時(shí)在- (void)layoutSubviews
方法中重載子視圖frame布局券册。
2奈籽、- (void)layoutSubviews
方法調(diào)用時(shí)機(jī):
(1) 視圖有frame變化
(2)addsubview
的時(shí)候
(3)init
時(shí)是不會(huì)觸發(fā)厘惦,只有在init
帶frame
時(shí)會(huì)觸發(fā)
3偷仿、-(void)setNeedsLayout
標(biāo)記需要重新布局:異步調(diào)用-layoutIfNeeded
刷新布局哩簿,一定會(huì)調(diào)用- (void)layoutSubviews
4、-(void)layoutIfNeed
如果有要刷新的標(biāo)記酝静,立即調(diào)用-(void)layoutSubviews
立即刷新的方法:
//刷新的視圖
[view layoutIfNeed];
5节榜、 撥打電話的API
NSString *phoneNumber = [NSString stringWithFormat:@"telprompt:%@", phone];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
});
在iOS10 之后會(huì)阻塞主線程,導(dǎo)致有很長(zhǎng)的延遲别智。加上一個(gè)異步線程去處理會(huì)減少延遲宗苍。
6、 iOS11中AppIcon不顯示的問題
使用了CocoaPods的Xcode工程,在iOS11版的手機(jī)上AppIcon不顯示,原因是CocoaPods的資源編譯腳本在iOS11下出了點(diǎn)問題.需要修改腳本.兩種修改方式:
- 在Podfile添加腳本修改
1>在Podfile 添加如下代碼
post_install do |installer|
copy_pods_resources_path = "Pods/Target Support Files/Pods-[工程名]/Pods-[工程名]-resources.sh"
string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'
assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'
text = File.read(copy_pods_resources_path)
new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)
File.open(copy_pods_resources_path, "w") {|file| file.puts new_contents }
end
需要注意的是,將[工程名] 換成自己工程的名稱
2>然后運(yùn)行
$pod install
- 手動(dòng)修改
打開工程目錄下:[工程名]/Pods/Target Support Files/Pods-[工程名]/Pods-[工程名]-resources.sh這個(gè)文件,替換最后一段代碼:
//修改前
printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi
//修改后
printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"
fi
7薄榛、Xcode上傳IPA包到iTunes Connect后構(gòu)建版本不顯示
這個(gè)問題是我在xcode升級(jí)到9.0之后上傳一個(gè)新的APP時(shí)遇到的讳窟,因?yàn)榈谝粋€(gè)版本APP比較簡(jiǎn)單所以很多用戶權(quán)限不需要用,導(dǎo)致在plist文件中權(quán)限聲明沒有加全敞恋。出現(xiàn)的問題就是IPA包在上傳到iTunes Connect中在構(gòu)建中顯示了一會(huì)兒就消失不見了丽啡,Apple也沒有任何的提示。經(jīng)過查閱資料發(fā)現(xiàn)有以下幾個(gè)原因?qū)е碌模?/p>
- 未聲明完整用戶權(quán)限硬猫,iOS10以后Apple更注重保護(hù)用戶權(quán)限,在任何需要使用設(shè)備權(quán)限的地方都需要提前聲明.
- 訪問了Apple禁止的私有api补箍,一般的是在第三方庫(kù)中(這個(gè)就需要花費(fèi)人工一個(gè)個(gè)的去排查了)。
第一個(gè)的解決辦法就是在plist文件中添加以下權(quán)限聲明:
<key>NSCameraUsageDescription</key>
<string>是否允許使用相機(jī)啸蜜?</string>
<key>NSContactsUsageDescription</key>
<string>是否允許訪問通訊錄坑雅?</string>
<key>NSMicrophoneUsageDescription</key>
<string>是否允許使用麥克風(fēng)?</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>是否允許訪問媒體資料庫(kù)衬横?</string>
我在設(shè)置了這幾項(xiàng)之后提交就沒有問題了裹粤,其他的幾項(xiàng)可以需要時(shí)再設(shè)置。
8蜂林、WKWebView加載本地HTML文件
//Base路徑
NSURL *baseUrl = [NSURL fileURLWithPath:[NSBundle mainBundle].bundlePath];
//文件路徑
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"headLines" ofType:@"html"];
//html文件
NSString *html = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:html baseURL:baseUrl];
向HTML文件中插入數(shù)據(jù)
NSURL *baseUrl = [NSURL fileURLWithPath:[NSBundle mainBundle].bundlePath];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"headLines" ofType:@"html"];
NSString *html = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSString *html1 = [html stringByReplacingOccurrencesOfString:@"{title}" withString:@"頭條文章"];
NSString *html2 = [html1 stringByReplacingOccurrencesOfString:@"{time}" withString:@"2018-7-09"];
NSString *html3 = [html2 stringByReplacingOccurrencesOfString:@"{body}" withString:@"頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章頭條文章"];
[self.webView loadHTMLString:html3 baseURL:baseUrl];
根據(jù)HTML中的標(biāo)示替換字符串即可
9遥诉、動(dòng)畫切換window的根控制器
// options是動(dòng)畫選項(xiàng)
[UIView transitionWithView:[UIApplication sharedApplication].keyWindow duration:0.5f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
BOOL oldState = [UIView areAnimationsEnabled];
[UIView setAnimationsEnabled:NO];
[UIApplication sharedApplication].keyWindow.rootViewController = [RootViewController new];
[UIView setAnimationsEnabled:oldState];
} completion:^(BOOL finished) {
}];
10、按鈕在屏幕底部左側(cè)時(shí)touchDown事件觸發(fā)延遲悉尾,是因?yàn)橄到y(tǒng)的手勢(shì)影響了底部按鈕事件的傳遞突那。
解決辦法:
//在控制器中設(shè)置
[self.navigationController.interactivePopGestureRecognizer setDelaysTouchesBegan:NO];
for (UIGestureRecognizer *gesture in self.view.window.gestureRecognizers) {
gesture.delaysTouchesBegan = NO;
}
11挫酿、tableview滑動(dòng)到頂部的方法
//方法一//
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
//方法二//
[self.tableView setContentOffset:CGPointMake(0,0) animated:NO];
//方法三//
NSIndexPath* indexPat = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPat atScrollPosition:UITableViewScrollPositionBottom animated:YES];
持續(xù)更新中