ios 8 的旋转问题,用于添加到 Windows 的视图

Posted

技术标签:

【中文标题】ios 8 的旋转问题,用于添加到 Windows 的视图【英文标题】:Rotation issue with ios 8 for view which are added to windows 【发布时间】:2014-09-05 11:29:00 【问题描述】:

我已经为视图旋转创建了类别,并在控制器视图和窗口上添加了视图(用于显示自定义指标)。 我的代码在 xCode 5.X 和 xCode6-beta6 上运行良好,最高可达 7.X。但不适用于 ios 8 beta。 似乎 Windows 旋转不适用于 ios 8 beta,就像旧版 ios 一样。

你能推荐我吗.... 提前非常感谢。

我的代码是这样的

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration 
 if(!self.isIpad)


    [menu.view rotateViewToOrientation:newStatusBarOrientation animated:YES];
    if(newStatusBarOrientation==UIInterfaceOrientationPortrait || newStatusBarOrientation==UIInterfaceOrientationPortraitUpsideDown)
    
        if (IS_IPHONE_5) 
            menu.view.frame= CGRectMake(0, 518, 320, 50);
         else 
            menu.view.frame= CGRectMake(0, 430, 320, 50);
        

      else if(newStatusBarOrientation==UIInterfaceOrientationLandscapeLeft) 

        if (IS_IPHONE_5) 
            menu.view.frame= CGRectMake(270,0,50,568);
         else 
            menu.view.frame= CGRectMake(270,0,50,480);
        

     else 

        if (IS_IPHONE_5) 
            menu.view.frame= CGRectMake(0,0,50,568);
         else 
            menu.view.frame= CGRectMake(0,0,50,480);
        
    
    [menu reloadMenu];
  



//Method of Menu Class for orientation change setup
- (void)rotateViewToOrientation:(UIInterfaceOrientation)orientation animated:(BOOL)animated 
CGPoint center = self.center;
CGRect bounds = self.bounds;
CGAffineTransform transform = CGAffineTransformIdentity;
int intOri=orientation;
switch (intOri) 
    case UIInterfaceOrientationPortraitUpsideDown:
        transform = CGAffineTransformMakeRotation(M_PI);
        break;
    case UIInterfaceOrientationLandscapeLeft:
        transform = CGAffineTransformMakeRotation(-M_PI_2);
        break;
    case UIInterfaceOrientationLandscapeRight:
        transform = CGAffineTransformMakeRotation(M_PI_2);
        break;
    case UIInterfaceOrientationPortrait:
        transform = CGAffineTransformMakeRotation(0);
        break;


if (animated) 
    [UIView beginAnimations:nil context:nil];

self.transform = transform;
bounds = CGRectApplyAffineTransform(bounds, transform);
self.bounds = CGRectMake(0, 0, bounds.size.width, bounds.size.height);
self.center = center;
 if (animated) 
    [UIView commitAnimations];
 

【问题讨论】:

粘贴一些代码并展示你是如何遇到问题的,是否有任何函数没有调用或其他任何事情?? 一般来说,大多数开发人员不知道应该如何构建适当的视图层次结构,这可能是问题的根源——您能否发布一些有关如何构建视图层次结构的代码? @Jageen 我已经添加了我的代码,你能给我建议吗,我应该遵循什么来使我的应用程序 ios 8 兼容。 @AshwinKanjariya,我不明白为什么您需要手动处理视图框架。您听说过 auto layoutauto resize-masks 吗?我建议您尽快了解它们。 @holex 实际上它的代码太旧了(从 IOS 3.X 开始),大约 4 年。而且应用程序足够大,所以我不能为每个类使用自动布局甚至自动调整大小掩码。希望你能理解。我只想修复视图相关问题以支持 IOS 8。 【参考方案1】:

我已经尝试了很多修复...并且它与补丁一起工作


[self.window setBounds:temp];
[menu.view setFrame:CGRectMake(0, self.window.frame.size.height-50, self.window.frame.size.width, 50)];
[menu.view removeFromSuperview];
[self.window addSubview:menu.view];
[self.window makeKeyAndVisible];

并将 CGAffineTransformMakeRotation 的角度重置为 0 度,适用于所有类型的设备模式。适用于 ios 8。

我知道这不是一个合适的解决方案,但我没有任何替代方法,所以等待一个好的答案。

【讨论】:

【参考方案2】:

就我而言,只需将所有方向的旋转角度设置为 0 即可解决问题。在 iOS 8 之前,UIWindow 坐标始终是纵向的,所以你必须自己处理旋转。这在 iOS 8 中不再需要。至于为什么要将 UIViews 添加到 UIWindow,我这样做是为了提醒我想在其他所有内容之上显示,而不管当前视图层次结构如何。

【讨论】:

【参考方案3】:

有类似的问题。令人惊讶的是,修复方法是注释掉 Appdelegate 上与 self.window 相关的所有代码。

注释了 self.window 的初始化及其赋值。通过选中“是初始视图控制器”复选框,在属性检查器的情节提要中设置初始视图。

新的更好的解决方案 评论 self.window 导致了其他问题。相反,下面的代码是最好的:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification 
    
         [UIViewController attemptRotationToDeviceOrientation];
    

【讨论】:

以上是关于ios 8 的旋转问题,用于添加到 Windows 的视图的主要内容,如果未能解决你的问题,请参考以下文章

是否有用于图像裁剪和旋转的视图控制器,如 iOS 8 photo.app?

将旋转到 iOS 8 上未调用的界面方向

出现弹出窗口时,iOS 8 中禁用 UISplitViewController 纵向到横向旋转

iOS 如何为旋转、缩放和将 UIView 添加到 UIIMageView 进行撤消操作

iOS_book03 -自动旋转自动调整大小尺寸分类器

ios 8 - MPMoviePlayerController 视频未相应旋转