ipad旋转屏幕失灵(ipadpro11笔能一直吸着么)

  • 时间:
  • 浏览:73
  • 来源:奥一装修网

ipad自动旋转失灵

目录1。最令人困惑的三个枚举2。触发屏幕旋转的两种方法3。屏幕旋转控制的优先级4。启用屏幕旋转的全局权限5。启用屏幕旋转的本地权限(视图控制器)6。实现要求:项目的主界面是垂直屏幕,有些界面是水平的。 7。默认水平屏幕无效。 8。旋转后的适应问题。 9。 APP为全屏。 1。当我第一次接触屏幕旋转知识时,最疯狂的也许是三种相关的枚举类型,分别是UIDeviceOrientation,UIInterfaceOrientation,UIInterfaceOrientationMask。下面我们分析三个属性:1。设备方向:UIDeviceOrientationUIDeviceOrientation是硬件设备(iPhone,iPad等)的当前旋转方向。设备指示有7种类型(包括未知情况)。方向基于归位键的位置。让我们看一下它们在源代码中的定义,如下所示:// Portrait表示肖像,Landscape表示风景。 typedef NS_ENUM(NSInteger,UIDeviceOrientation){UIDeviceOrientationUnknown,//设备垂直放置,顶部位于主页按钮UIDeviceOrientationPortraitUpsideDown,设备水平放置,位于右侧的主页按钮UIDeviceOrientationLandscapeLeft,位于左侧的房屋价格按钮面向设备的平面,朝上UIDeviceOrientationFaceUp,@Device平面的,朝下UIDeviceOrientationFaceDown} __TVOS_PROHIBITED; 设备方向只能接受值,不能设置,请使用当前方法获取设备【Device】 。orientation监视设备方向的变化,我们可以使用Appdelegate文件中的通知,如下所示: 【【NSNotificationCenter defaultCenter】 addObserver:自我选择器:@selector(onDeviceOrientationDidChange)对象对象对象对象对象对象对象对象对象对象设备设备设备设备当前设备】 beginGeneratingDeviceOrientationNotifications】; -(BOOL)onDeviceOrientationDidChange()//获取当前设备DeviceUIDevice * device = 【UIDevice currentDevice】; //识别当前设备的旋转方向Break; case UIDeviceOrientationFaceDown:NSLog(@“屏幕躺着”); break; case UIDeviceOrientationUnknown://当前系统无法识别设备的方向,可能会倾斜NSLog(@“未知方向”); break; case UIDeviceOrientationLandscapeLeft:NSLog(@“点击屏幕左侧”); break; case UIDeviceOrientationLandscapeRight:NSLog(@“点击屏幕向右”); break; case UIDeviceOrientationPortrait:NSLog(@“屏幕垂直”); break ;;; case case case UIDeviceOrientationPortraitUpsideDown:NS NSLog(@“ screen,立,倒置”); NS NS break default default日志 default; }2。页面方向:UIInterfaceOrientationUIInterfaceO方向程序界面的当前旋转方向(可以设置)。源代码的定义如下://这是因为将设备向左旋转需要将内容向右旋转。 Typedef NS_ENUM(NSInteger,UIInterfaceOrientation){UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight = UIDeviceOrientationLandscapeRight = UIDeviceOrientationLand 与UIDeviceOrientation的区别,这意味着我们开发的程序接口的方向使用UIInterfaceOrientation。 值得注意的是:UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,12我们可以发现两者中的大多数枚举值都可以映射。仅当左右旋转时,UIInterfaceOrientationLandscapeLeft和UIDeviceOrientationLandscapeRight相等,反之亦然,因为向左旋转设备需要旋转程序界面右侧的内容。页面方向3: UIInterfaceOrientationMaskUIInterfaceOrientationMask iOS6的是枚举后增加,它的源代码如下:typedef NS_OPTIONS(NSUInteger,UIInterfaceOrientationMask){UIInterfaceOrientationMaskPortrait =(1 UIInterfaceOrientationMaskLandscapeLeft =(1 UIInterfaceOrientationMaskLandscapeRight =(1 UIInterfaceOrientationMaskPortraitUpsideDown =(1 UIInterfaceOrientationMaskLandscape =(UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight) ,UIInterfaceOrientationMaskAllButUpsideDown =(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),} __TVOS_PROHIBITED; 我们知道UIDeviceOrientation和UIInterfaceOrientation之间的区别是设备方向。 UIInterfaceOrientation和UIInterfaceOrientationMask有什么区别?实际上,查看源代码,我们会发现这是为了支持多个UIInterfaceOrientation而定义的类型。下面的示例很好地说明了这一点:iOS6之后,我们通常通过以下三种方法控制单个界面的旋转://方法1-(BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0)__TVOS_PROHIBITED; //方法2-(UIInterfaceOrientationMask)支持的InterfaceOrientations NS_AVAILABLE_IOS(6_0)__TVOS_PROHIBITED; //返回接口方向掩码//方法3

ipad屏幕旋转失灵维修费用

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0)__TVOS_PROHIBITED;。方法2是设置当前接口支持所有方向的效果更方便的表达式支持多向旋转。 Method 3的作用是设置界面的默认支持方向。使用返回值类型UIInterfaceOrientation。接口的默认方向是某个方向,因此UIInterfaceOrientation更合适。 二,两种屏幕旋​​转触发方法在我们开发的大多数应用中,大多数界面都支持垂直屏幕,而一些特殊的界面则支持旋转水平屏幕。这两个接口在彼此之间切换,并且有两种情况触发它们的旋转。 :案例1:系统没有关闭自动旋转屏幕功能。 在这种情况下,支持旋转的界面会随着用户的手持设备自动旋转。我们需要在当前视图控制器中添加以下方法:// 1。确定当前屏幕是否自动打开。如果返回NO,则不会调用后两个方法,但将支持默认方向-(BOOL)shouldAutorotate {return YES; }// 2。返回支持的旋转方向//在iPad设备上,默认返回值UIInterfaceOrientationMaskAllButUpSideDwon//在iPad设备上,默认返回值为UIInterfaceOrientationMaskAll-(UIInterfaceOrientationMask)受支持的InterfaceOrientations {return UIInterfaceOrientationMaskAll; }// 3。返回界面的默认显示方向-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return UIInterfaceOrientationPortrait; }情况2:强制单个界面旋转通过单击程序界面切换到水平屏幕(特别是在视频播放的情况下),有两种方法://方法1:@ If(【【【UIDevice currentDevice】 responsToSelector:@selector(setOrientation :)】){【【UIDevice currentDevice】 setValue:【NSNumber numberWithInteger:direction】 键:方法用于ient ient ru ru 2:-( void)setInterfaceOrientation:(UIInterfaceOrientation)方向{如果if(【【UIDevice currentDevice】 responsesToSelector:@selector(setOrientation :)】){sel sel sel selector = NSSelectorFromString(@“ setOrientation:”); vin invocation = 【NSInvocation invocationWithMethodSignature:【UIDevice 实例methodSignatureForSelector:选择器】】; 【【invocation setSelector:选择器】; 【职业setTarget:【UIDevice currentDevice】】; 方向方向【调用调用】; 注意:使用这两种方法时,还请确保shouldAutorotate方法返回YES,以便这两种方法都将生效。另请注意,两者使用不同的参数类型。 三,屏幕旋转控制优先级实际上,如果仅使用上述方法控制旋转的打开和关闭,则不能满足我们的需要,该方法无效。这是因为我们忽略了轮换权限优先级的问题。有许多与屏幕旋转相关的设置,包括Xcode的常规设置,info。plist设置和代码设置等。因此许多设置非常复杂。但是,这些实际上是在不同级别旋转的设置。我们将遇到这样的情况:将旋转设置为禁用是无效的,这很可能是由上一个级别控制的原因。 我们首先有一个大致的了解,控制屏幕旋转的优先级是:Engineering Target属性配置(全局权限)= Appdelegate && Window》根视图控制器》普通视图控制器描述此问题的权限可能没有准备得很充分。实际上,这是设置设备可以支持的方向,这也是实现旋转的前提。 共有三种方法来打开屏幕旋转的全局权限,包括两种通过Xcode直接配置的方法和一种代码控制的方法。这三种方法的工作原理相同,但是由于在程序启动后才进行代码控制,因此它也是最有效的。下面介绍这三种方法的用法:1。Device Orientation属性配置我们创建了一个新项目,Xcode为我们选择了几个默认情况下支持旋转的方向。这是“设备方向”属性的默认配置。依次在【Xcode】中打开【常规】-》 【部署信息】-》 【设备方向】,我们可以看到默认情况下支持的设备方向如下:可以发现默认情况下不支持UpsideDown,因为即使对于iPhone没有UpSideDown旋转效果。如果是iPad设备,它将同时支持四个方向。 值得注意的是,对于iPhone,如果我们选择四个属性中的全部或不选择任何一项,则效果与默认设置相同。 2。Info。Plist设置实际上,在我们设置了设备方向后,转到info。plist并检查支持的界面方向,我们将看到:是,这时支持的界面方向的设置与UIDevice Orientation的值,我们在此处添加或删除这些值,UIDevice Orientation的值将相应地更改,两者都属于同一设置。 3。Appdelegate && Window中设置通常情况下,我们的App是从Appdelegate启动的,并且Appdelegate拥有的唯一Window对象是全局的,因此在Appdelegate文件中设置屏幕旋转也是全局有效的。以下代码集仅支持垂直屏幕和向右旋转:-(UIInterfaceOrientationMask)应用程序:(UIApplication *)应用程序支持InterfaceOrientationsForWindow:(UIWindow *)窗口{返回UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft; }值得注意的是:如果我们使用Appdelegate的此方法实现,则即使前两个方法的设置与此处的设置不同,我们的App的全局旋转设置也会在此处占优势。 五,打开屏幕旋转的本地权限(视图控制器)设置全局支持的旋转方向后,然后开始设置特定的控制器界面。上面我们已经解释了轮换的优先级。UINavigationBarController,UIViewController)由于打开了全局权限,因此具有最高权限的下一个窗口是Window的根视图控制器。如果要专门控制单个UIViewController的旋转,则必须首先查看根视图控制器的配置。 当然,通常,我们的项目通常使用UITabbarViewController作为Window的根视图控制器,然后管理多个导航控制器UINavigationBarController,然后导航栏控制器管理公共视图控制器UIViewController。以这个为例,从高到低的旋转优先级是UITabbarViewController》 UINavigationBarController》 UIViewController。如果具有高优先级的控制器关闭了旋转设置,则具有低优先级的控制器将无法旋转。 例如,我们设置一个视图控制器可以自动旋转。这需要向视图控制器中添加shouldAutorotate方法,以将YES或NO返回给控件。但是,如果存在上层根视图控制器,并且仅在此视图控制器中实现该方法,则将发现该方法是不允许的,因为该方法被上层根视图控制器拦截。了解此原理后,我们有两种方法可以实现自动可控的旋转设置。 方法1:逐级设置每个视图控制器,高优先级视图控制器会影响低优先级控制器,要解决上述问题,我们需要将UITabbarViewController设置如下://是Autorotation-(BOOL)shouldAutorotate {返回self。selectedViewController。shouldAutorotate; }//支持哪些屏幕方向返回【self。selectedViewControllersupportedInterfaceOrientations】; }// defaultdirection-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return 【self。selectedViewController preferredInterfaceOrientationForPresentation】; }设置导航控制器UINavigationController如下:/返回导航控制器的顶部视图控制器的auto-rotation属性,因为导航控制器将VC覆盖在堆栈上,原因是// topViewController是其最顶部的视图控制器,

ipad屏幕怎么不旋转了

-(BOOL)shouldAutorotate {return self 。topViewController。shouldAutorotate; }//支持的屏幕方向-(UIInterfaceOrientationMask)受支持的界面方向{return 【self。topViewControllersupportedInterfaceOrientations】; }//默认方向-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {。 ViewView自己的preferredInterfaceOrientationForPresentation】; }在这里我们应该理解,它实际上是高优先级的视图控件,跟随控制器配置的旋转是低优先级的。方法2:采用其他方法并使用模式视图使用模式视图不受此根视图控制器优先级的限制。这也很容易理解。模态弹出视图控制器是隔离的,不受根视图控件的影响。具体设置与普通查看器代码相同,因此在此不再赘述。 六,实施要求:项目的主界面为竖屏,有些界面为横屏这实际上是屏幕旋转的最常见要求之一。经过上面的描述,我们将轻松实现此要求,但是具体实现是有不同的想法,在这里我总结了两种方法:方法1:使用基类控制器逐步控制步骤:1。打开全局权限设置项目以支持旋转方向2。根据第五部分方法1,自定义标签控制器和导航控制器以设置屏幕的自动旋转。 3。自定义基本控制器设置不支持自动屏幕过渡,默认情况下仅支持垂直屏幕。4。为需要在项目中进行屏幕过渡的控制器启用自动屏幕过渡,设置支持的旋转方向并设置默认方向。 demo1链接:https://github。com/DreamcoffeeZS/Demo_TestRotatesOne。git方法2:Appdelegate添加旋转属性步骤:1。在Applegate文件中添加一个属性,用于记录当前屏幕是否水平。 2。横屏界面,进入界面后强制横屏,退出界面后恢复竖屏demo2链接:https://github。com/DreamcoffeeZS/Demo_TestRotatesTwo。git七,默认横屏无效问题在在上述项目中,我们可能会遇到默认水平屏幕的问题,将其取出并进行详细说明。 在我们的项目中,有一个接口A支持垂直屏幕,而接口B支持水平和垂直屏幕,而接口B在需要输入时显示水平屏幕。从接口A到接口B,如果使用第五节中的方法1,则会遇到无法显示默认水平屏幕的情况。由于没有旋转设备,因此将不会调用shouldAutorotate,并且我们将无法显示所需的水平屏幕。 。这里有两个解决方案:方法1:将以下方法添加到自定义导航控制器中//不要忘记设置代理人-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animation:(BOOL)动画{【self presentViewController:【UIViewController new】动画:没有完成: ^ {【self dismissViewControllerAnimated:无完成:无】; }}】; }此方法的缺点是,原则上使用弹出模式视图来调用屏幕,从而在切换界面时产生闪烁效果,并且体验不好。因此,这里只是一种思考方式,不建议使用。 方法2:在需要默认水平屏幕的界面中进行设置,进入时强制使用水平屏幕,离开时强制使用垂直屏幕为此,请参考第五节中的demo2。注意:这两种方法不能可同时使用。 八,关于旋转后的适应问题屏幕旋转的实现会带来相应的UI适应问题。我们需要在不同方向上重新调整界面的视图布局。首先,我们需要能够检测到屏幕旋转事件,分为两种情况:1。监视中的视图控制器UIViewController发生屏幕转换事件时,以下UIViewControoller方法将检测到屏幕旋转事件视图,从而帮助我们适应/ *当视图控制器的视图大小为如果您覆盖此方法,则应调用super来将更改传播给子级,或手动将更改转发给子级。 * /-(无效)viewWillTransitionToSize:(CGSize)sizewithTransitionCoordinator:(id)协调器NS_AVAILABLE_IOS(8_0); 从注释中可以看出,旋转屏幕时会调用此方法,并且在使用它时也应首先调用super方法。具体的代码用法示例如下://旋转屏幕后,屏幕的宽度和高度会互换。 ,我们用它来判断重新布局///横屏:size。width》 size。height///竖屏:size。width-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator {super viewWillTransitionToSize:withTransitionCoordinator的大小:coordinator】; if(size。width》 size。height){水平设置,为防止键盘被阻塞,请调整输入视图的高度。self。textView_height。constant = 50; self} else {//垂直屏幕设置self。textView_height。constant = 200; }}}2。如果监视器类似于表格视图中的单元格,则要监视屏幕的更改以实现适应,当屏幕在水平和垂直屏幕之间切换时触发此方法,然后我们可以根据状态栏的位置判断水平和垂直屏幕。代码示例如下:-(void)layoutSubviews {【super layoutSubviews】; //通过状态栏电池图标判断水平和垂直屏幕(UI UI sharedApplication)。statusBarOrientation == UIInterfaceOrientationMaskPortrait){垂直屏幕布局垂直}其他{水平屏幕布局水平屏幕布局有时项目需要从应用程序启动默认情况下,它是横向模式。这是一个非常方便的方法。我们在“设备方向”属性配置中进行如下设置:但是,如果仅执行此操作,则该项目将仅支持横向模式,因此我们可以在Appdelegate中再次进行调整。已经提到了支持的方向和方法,因此在此不再赘述。 ---------------------作者:吴宇北辰原文:https://blog。csdn。net/DreamcoffeeZS/article/details/