开发场景说明
App开发中NavgationController的使用基本上是属于标配的一个控件,当然可能也有App不适用,这里不做这方面的展开讨论,文章主要针对的是iOS11下使用自定义NavgationBar的一个适配想法。下面我会具体说明下我这边自定义NavgationBar的实现方式。
目前在项目中由于自己使用习惯或者说是想达到某些特定业务效果情况下,我习惯是把系统的NavgationBar给setHidden=YES。也是为了方便页面在各种场景(有无NavgationBar)的切换不会产生异常的展示效果。
正文
前景基本交代这么多,如果有更好的方式希望大家也沟通下,因为个人工作缘故好久没有做UI相关的开发工作,所以此处只是自己在某些场景下的一些实现想法。针对不同业务或者功能场景也有更适合的设计和实现策略。大家可以在评论处留言讨论下。
下面是我创建页面的一个简单的代码实现,大家可以参考的看,方便后面理解场景。
#import "MainViewController.h"
@interface AppDelegate ()
@property (strong, nonatomic) UINavigationController *navgationController;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
MainViewController * mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
self.navgationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
[self.navgationController setNavigationBarHidden:YES];
_window.rootViewController = self.navgationController;
[_window makeKeyAndVisible];
return YES;
}
OK,上面代码创建一个NavgationController包裹的主视图,这也是为了之后方便Push其他页面。这是项目的一个主的Navgation栈,后面一些场景也可以针对性的去presentViewController一个类同带NavgationController的支线视图控制器,然后继续自己的支线Push操作等。
回到正题,下面说下我这边自定义NavgationBar的一个实现。
好吧,我其实就是放了一个View,当然你可以手写代码在BaseViewController实现。但是我是重度Xib患者,基本上习惯这种所见即所得的方式,针对业务功能改变也觉得快速一些。仅仅是个人一个癖好。
这个视图在正常非iPhone X之前其实是没有问题的,设置好约束会自动适配各种正常矩形屏幕的展示,但是iPhone X的刘海的出现还是有些问题的。
因为是Xib其实当时考虑就是不同页面导航条的展示可能会有不同,通过加一个相同的容器View,你可以自己在Xib上实现不同的样式的导航条,当然代码也可以实现,在这里不做辩论噢。
我这边想到的一个适配方式就是让这个自定义的导航条View继承自一个自己的Class。然后在根据设备去判断更新他的约束。
然后在这个自定义的View下去实现一些对设备的简单判断。
#define kDeviceStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height
@implementationCCNavgationBarView
- (void)awakeFromNib{
[super awakeFromNib];
//针对iPhone X做处理
if(kDeviceStatusBarHeight>20) {
}
}
@end
当然这个判断其实不严谨,打电话的时候这个高度其实也不是20,后续可以完善,这边只是一个实现🌰。我们下面继续。
当然做到这之后就需要针对这个留海设备去做约束的处理了。我们在这个自定义View的头文件声明两个属性,主要是针对不同产品策略做不同修改用。
@property(weak,nonatomic)IBOutletNSLayoutConstraint*topConstraint;
@property(weak,nonatomic)IBOutletNSLayoutConstraint*heightConstraint;
字面上应该就能理解的。我这边就不做解释了,毕竟是简单的驼峰式英文命名。这时候我们回答Controller的Xib视图,做下关联。
我们再回到自定义View的刚才实现的if判断代码中增加一行。
self.heightConstraint.constant+=kDeviceStatusBarHeight;
OK,再次运行效果。
以上,就是一个场景做适配的基本想法。
不喜可以轻喷~感谢您抽空看到这一行~~~