iOS开发 ipad屏幕有黄斑上的tabbar怎么平分居中

个人交流学习,github地址:https://github.com/LQi2009
[iOS]关于iOS中界面视图横屏/竖屏切换的问题总结
最近在项目中有个这样的需求:整个APP中界面也竖屏为主,且不能自动横竖屏切换,个别页面可以根据手机的方向横竖屏切换;其实实现起来也并不难,关于视图是否能旋转主要还是有没有设置支持,在工程的General--&Device Orientation里可以进行这些设置:
这些设置后就可以在项目中用代码控制了,控制视图是否能够自动旋转,支持哪些方向主要是用了下面的三个方法:
// New Autorotation support.
//是否自动旋转,返回YES可以自动旋转
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
//返回支持的方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
// Returns interface orientation masks.
//这个是返回优先方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;一般情况下实现前两个方法即可!!这些都是UIViewController的实例方法,直接在需要设置的控制器重写就行...
可能,你会发现,有时候重写了,但是并没有用,明明返回了NO,但是视图还是会根据手机方向自动旋转,这里就要注意一下了,当前的设置必须是影响了工程的跟视图控制器才行,如果你在跟视图控制器里做如下设置:
- (BOOL)shouldAutorotate{
return NO;
}那么无论你怎么旋转手机,视图是不会跟着转的.很多时候,我们需要旋转的页面并不是跟视图,这就要想办法告诉跟视图,这个界面我设置了可以自动旋转,跟视图控制器再进行相应的设置,才会有效果!
怎么告诉跟视图控制器呢?这要视情况而定了:
1.当前viewcontroller就是跟视图控制器
这种最简单,直接重写上面的方法,设置可以支持的方向,和是否自动旋转即可;这种情况比较少见
2.项目的跟视图控制器是导航(UINavigationController)
这种情况也很简单,可以自定义一个导航类,在这个导航类里实现如下方法:
-(BOOL)shouldAutorotate
return [[self.viewControllers lastObject] shouldAutorotate];
#if __IPHONE_OS_VERSION_MAX_ALLOWED & __IPHONE_9_0
- (NSUInteger)supportedInterfaceOrientations
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}然后在需要特殊设置的控制器内,重写这几个方法即可.
上面的[self.viewControllers lastObject]是获取当前导航的栈顶的控制器,用他去调自己重写的方法,返回需要设置的值
这样也能达到控制某个页面是否支持旋转的目的;
还有一种方法,如果需要自动旋转的页面能够预知,可以在这个跟视图导航里做如下设置:
-(BOOL)shouldAutorotate
if ([[self.viewControllers lastObject]isKindOfClass:[FirstViewController class]]) {
return YES;
return NO;
return [[self.viewControllers lastObject] shouldAutorotate];
}上面是设置FirstViewController可以自动旋转,其他界面不能自动旋转;这种方法的好处是不需要在需要旋转的视图控制器重写上面的方法了;
3.项目的跟视图是UITabBarController
很多情况下都是这样,项目的跟视图是一个tabBar,其实明白了原理,实现起来也不难,就是怎么告诉跟视图控制器,这个界面需要支持自动旋转;由于在tabBar里直接获取需要旋转的控制器比较困难,所以,本人采用通知的形式:
在跟视图控制器(tabBar)中设置一个全局的BOOL值
BOOL shouldA用于接收通知发送来的结果,并设置跟视图的返回结果;
@return 是否支持旋转
-(BOOL)shouldAutorotate
NSLog(@"======%d",shouldAutorotate);
if (!shouldAutorotate) {
return NO;
return YES;
适配旋转的类型
@return 类型
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
if (!shouldAutorotate) {
return UIInterfaceOrientationMaskP
return UIInterfaceOrientationMaskAllButUpsideD
}最后添加一个通知监听,并实现通知方法:[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(AutorotateInterface:) name:@"InterfaceOrientation" object:nil];
-(void)AutorotateInterface:(NSNotification *)notifition
shouldAutorotate = [notifition.object boolValue];
在通知调用的方法里,将传过来的值赋给shouldAutorotate,然后跟视图会根据shouldAutorotate的值设置响应的结果;
最后在需要自动转屏的控制器里发送通知即可:
[[NSNotificationCenter defaultCenter] postNotificationName:@"InterfaceOrientation" object:@"YES"];最后介绍一个强制转屏的方法,这个方法可以在进入某个视图时,强制转成你需要的屏幕方向,用的比较多的是在一个竖屏的应用中强制转换某一个界面为横屏(例如播放视频):
//强制旋转屏幕
- (void)orientationToPortrait:(UIInterfaceOrientation)orientation {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&val atIndex:2];//前两个参数已被target和selector占用
[invocation invoke];
调用的时候只需把你想要的方向传过去即可!!
使用的时候有个点需要注意,从A进入B的时候,把B强制转换成横屏,返回的时候,需要在A出现的时候再转换为原来的方向,不然会有问题;个人建议可以在B的viewWillAppear调用这个方法,转换屏幕(例如转换为横屏),然后在A的viewWillAppear中转换回来;
最后附上以上内容的Demo:
没有更多推荐了,&&&&给TabBar上中间的tab添加弹出式菜单。菜单弹出的动画效果很不错,并且弹出菜单后,中间的tab会发生变化。
测试环境:
&&[Code4App]编译测试
代码评论:
登录后方可评论
呵呵我当前就下载来研究
登录后方可评论
这个demo有bug。定义的第二个view实际上是没有作用的或者把它放在几个按钮中德一个会有作用
但是tabbar里左边的按钮稍微右边一点或者右边的按钮稍微按到左边一点,就算没有点到按钮也会跳转到第二个view上希望改进
登录后方可评论
请问这个代码中的TabBarController和 三个视图之间的对应关系是怎么在xib文件中定义的呢?
是直接改xib文件的源码吗?
登录后方可评论
小图标都不能自定义
登录后方可评论
-控件分类-
-功能分类-当前位置浏览文章
有关涉及iPhone X的tabbar适配在iPhone X假如tabbar的是自己设置的,那么其中必然会有自己增加的按钮,没有做任何适配的话,会出现如下的情况:没有适配前这是由于tabbar的高度从49变成了83之前用的这个按钮是居中的composeButton.centerX = width
0.5composeButton.centerY = height
0.5这个时候需要将按钮的y坐标上移 (83 - 49)
0.5, 即17能用下面这个分类对手机的型号进行判断,而后做解决,这个分类也是借鉴的他人的,目前已经升级到8/8plus/X的判断extension UIDevice {
var deviceType: String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
switch identifier {
case "iPod5,1":
return "iPod Touch 5"
case "iPod7,1":
return "iPod Touch 6"
case "iPhone3,1", "iPhone3,2", "iPhone3,3":
return "iPhone 4"
case "iPhone4,1":
return "iPhone 4s"
case "iPhone5,1", "iPhone5,2":
return "iPhone 5"
case "iPhone5,3", "iPhone5,4":
return "iPhone 5c"
case "iPhone6,1", "iPhone6,2":
return "iPhone 5s"
case "iPhone7,2":
return "iPhone 6"
case "iPhone7,1":
return "iPhone 6 Plus"
case "iPhone8,1":
return "iPhone 6s"
case "iPhone8,2":
return "iPhone 6s Plus"
case "iPhone8,4":
return "iPhone SE"
case "iPhone9,1":
return "iPhone 7"
case "iPhone9,2":
return "iPhone 7 Plus"
case "iPhone10,1", "iPhone10,4":
return "iPhone 8"
case "iPhone10,2", "iPhone10,5":
return "iPhone 8 Plus"
case "iPhone10,3", "iPhone10,6":
return "iPhone X"
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
case "iPad3,1", "iPad3,2", "iPad3,3":
return "iPad 3"
case "iPad3,4", "iPad3,5", "iPad3,6":
return "iPad 4"
case "iPad4,1", "iPad4,2", "iPad4,3":
return "iPad Air"
case "iPad5,3", "iPad5,4":
return "iPad Air 2"
case "iPad2,5", "iPad2,6", "iPad2,7":
return "iPad Mini"
case "iPad4,4", "iPad4,5", "iPad4,6":
return "iPad Mini 2"
case "iPad4,7", "iPad4,8", "iPad4,9":
return "iPad Mini 3"
case "iPad5,1", "iPad5,2":
return "iPad Mini 4"
case "iPad6,7", "iPad6,8":
return "iPad Pro"
case "AppleTV5,3":
return "Apple TV"
case "i386", "x86_64":
return "Simulator"
return identifier
}}而后代码中加入这样的适配//
设置撰写按钮的中心点composeButton.centerX = width
// 适配iPhone X的自己设置tabbar按钮composeButton.centerY = UIDevice.current.deviceType == "iPhone X" ? height
0.5 - 17 : height
0.5注意目前笔者只有模拟器能跑,所以UIDevice.current.deviceType这个方法无法返回iPhone X,所以我是直接将y减去17有关判断设施型号的方法,大家能看这个UIDeviceIdentifier更改完后,即可以了适配完成后主题 : iPhone 应用改为通用后 在ipad 上底部tabbar 不显示
级别: 新手上路
可可豆: 85 CB
威望: 85 点
在线时间: 208(时)
发自: Web Page
来源于&&分类
iPhone 应用改为通用后 在ipad 上底部tabbar 不显示&&&
iPhone 应用改为通用后 在ipad 上底部tabbar 不显示 请问要怎么代码适配啊?有大神有demo发一下麽?
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版&&&&实现无限滚动或者无限循环的TabBar,可以摆放任意多个tab,或者循环滚动的tab。
测试环境:
&&[Code4App]编译测试
相关代码:
(12204次查看,4475次下载) 点击 TabBar 上的“更多”按钮时,会出现另外一条TabBar,显示更多隐藏的按钮。可用于TabBar上按钮过多的情况。
(23783次查看,4427次下载) 实现可以左右滑动的tab bar,从而可以放置更多tab。当bab bar上的tab比较多时,可以使用这种tab bar。
(31306次查看,7160次下载) 模仿Foodspotting的滚动菜单,可以实现滚动选择,可以放置多个菜单项目。
(21065次查看,6473次下载) 提供可十分灵活自定义的Tab Bar,包括自定义选择某个tab之后tab上的背景和光罩,自定义bar上的背景,可以加载任意多的tab,以及支持旋转。
(15888次查看,3502次下载) 实现可扩展的tab bar。用户点击“more”选项卡,tab bar展开,可以看到更多tab bar选项。再次点击“more”选项卡,tab bar收回。支持ARC。
(16759次查看,2683次下载) 实现类似Facebook iPhone应用的UITabBar样式。就是在UITabBar放多个tab,当多个tab无法同时显示时,可以用手指划动tab bar,之前隐藏的tab就会显示出来。
代码评论:
登录后方可评论
视频居然还有十几秒的广告??
登录后方可评论
-控件分类-
-功能分类-

我要回帖

更多关于 ipad屏幕闪烁怎么办 的文章

 

随机推荐