公司的產(chǎn)品要求做一個很通用框架的APP锯茄,在整個APP構(gòu)思的過程中還是有很多誤區(qū),以下為一些初步總結(jié):
一茶没、UINavigationController+UITabBarController 和 UITabBarController +UINavigationController差別
UITabBarController +UINavigationController ,從ViewController1push到下一個ViewController,UITabBar會自動消失:
UITabBarController *tabbar = [[UITabBarController alloc] init];
ViewController1 *v1 = [[ViewController1 alloc] init];
[tabbar addChildViewController:v1];
ViewControllerB *vb = [[ViewControllerB alloc] init];
[tabbar addChildViewController:vb];
MeViewController *me = [[MeViewController alloc] init];
[tabbar addChildViewController:me];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:tabbar];
nav.navigationBar.barTintColor = [UIColor redColor];
self.window.rootViewController = nav;
UINavigationController+UITabBarController 從ViewController1push到下一個ViewController晚碾,UITabBar不會自動消失抓半,可以通過系統(tǒng)自帶的hidesBottomBarWhenPushed使UITabBar隱藏,全都用原生的是沒有問題的格嘁,但是如果結(jié)合WKWebView笛求,因為有網(wǎng)絡(luò)請求和頁面加載的時差,導(dǎo)致加載過程中UITabBar會是黑色的背景,用戶體驗很差:
UITabBarController *tabbar = [[UITabBarController alloc] init];
ViewController1 *v1 = [[ViewController1 alloc] init];
UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:v1];
[tabbar addChildViewController:nav1];
ViewController2 *v2 = [[ViewController2 alloc] init];
UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:v2];
[tabbar addChildViewController:nav2];
self.window.rootViewController = tabbar;
二探入,合理抽取類
UITabBar顯示的ViewController與點擊ViewController進去的頁面抽取為2重不同的ViewController考慮為以下幾點:
①狡孔,frame的不同,UITabBar顯示的ViewController的frame需要減去tabbar的高度蜂嗽,而點進去的ViewController則不需要減去tabbar的高度
②苗膝,點擊ViewController進去的頁面只需要創(chuàng)建一次,其余交互頁面在該頁面交互即可植旧,不用每次點擊新頁面就創(chuàng)建新的ViewController
③辱揭,用戶體驗好,當用戶點擊了UITabBar頁面的ViewController立即創(chuàng)建新的ViewController病附,顯示加載中问窃,接近原生效果
附上實例代碼參考:
CommonWebViewVC
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSString *url = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
NSString* reUrl=[[webView URL] absoluteString];
if ([url containsString:kBaseUrl]||[url containsString:kProductBaseUrl])
{
reUrl=url;
}
if ([self show:reUrl]) {
decisionHandler(WKNavigationActionPolicyCancel);
SecondWebViewController* vc=[[SecondWebViewController alloc] init];
vc.delegate = self;
vc.webViewUrl=reUrl;
NSLog(@"redirectUrl=%@",reUrl);
[self.navigationController pushViewController:vc animated:YES];
}else{
decisionHandler(WKNavigationActionPolicyAllow);
NSLog(@"redirectUrl=%@,allow",reUrl);
}
}
-(BOOL)show:(NSString*) url{
return false;
}
BaseAppWebviewViewController
@interface BaseAppWebviewViewController : CommonWebViewVC
-(NSString*)loadUrl;
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
self.webView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kTabbarH);
// Do any additional setup after loading the view.
}
-(BOOL)show:(NSString *)url{//YES 攔截
//如果要跳轉(zhuǎn)的頁面不是當前頁面和空頁面
if (![url isEqualToString:[self loadUrl]]&&![[UrlCollection blankURL] isEqualToString:url]) {
return YES;
}
return NO;
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.navigationController.navigationBar.hidden = YES;
}
SecondWebViewController
@interface SecondWebViewController : CommonWebViewVC
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.webView.frame = CGRectMake(0, kStatusH, kScreenWidth, kScreenHeight - kStatusH);
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//將status bar 文本顏色設(shè)置為白色,當前頁面為白色
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
self.navigationController.navigationBar.hidden = YES;
}