标签: auto-rotation

在7.3/9/2 + Swift中如何禁用旋转动画,当设备旋转时?

这个问题严格关于iOS9 +

假设您有一个普通的现代应用程序(自动布局,故事板,通用),它允许所有四个旋转位置

在此输入图像描述

您希望它以正常方式自动旋转,因此当用户将设备从横向旋转到纵向时,它将更改为新的基于约束的布局

但是在用户旋转设备期间,您只是想要没有动画.你希望它只是"点击"到新的侧面或直立布局.

我能够实现这一目标的唯一方法是添加:

override func viewWillTransitionToSize(size:CGSize,
       withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
    {
    coordinator.animateAlongsideTransition(nil, completion:
        {_ in
        UIView.setAnimationsEnabled(true)
        })
    UIView.setAnimationsEnabled(false)
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
    }
Run Code Online (Sandbox Code Playgroud)

一个视图控制器,一个最高或接近最高的VC,它保存其余的容器视图或场景中的任何内容.

这与使用willRotateToInterfaceOrientation/didRotateFromInterfaceOrientation(现在都无法在现代iOS中使用)来开启动画的古老想法基本相同.

但是有很多问题

  • 这不起作用AppWide,它是一个烂摊子,它是基于场景的

  • 关闭所有动画似乎很糟糕

  • 你可以看到各种各样的赛道

这个问题严格关于iOS9 +

这些天,有没有更好的方法来关闭支持横向/肖像的应用程序中的旋转动画???

这个问题严格关于iOS9 +

ios auto-rotation swift ios-autolayout ios9

16
推荐指数
2
解决办法
1993
查看次数

检测iOS中的旋转更改

我正在制作一个iOS应用程序,需要在旋转时进行一些界面重新排列.我试图通过实现检测到这一点- (void)orientationChanged:(NSNotification *)note,但这会给我通知设备面朝上或面朝下的时间.

我想要一种方法来在界面改变方向时得到通知.

interface nsnotificationcenter screen-rotation ios auto-rotation

15
推荐指数
4
解决办法
2万
查看次数

UIPageViewController没有调整其子视图控制器的大小

我有一个以编程方式设置的视图控制器,它有一个孩子UIPageViewController.这将显示也以编程方式设置的各种其他视图控制器.这些视图控制器的视图已translatesAutoresizingMaskIntoConstraints设置为YES,但页面视图控制器的视图使用约束将自身定位在顶视图控制器中.

问题是,当用户旋转设备时,页面视图控制器会调整其框架的大小,但其子视图控制器不会.通过didRotateFromInterfaceOrientation,它的框架仍然是旧的方向.我已经验证了在子视图控制器上调用旋转方法,它们的框架不会改变.

我设置了这样的页面视图控制器:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.view.backgroundColor = [UIColor clearColor];
self.pageViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
self.pageViewController.dataSource = self;
self.pageViewController.delegate = self;
[self.pageViewController willMoveToParentViewController:self];
[self.view addSubview:self.pageViewController.view];
[self addChildViewController:self.pageViewController];
[self.pageViewController didMoveToParentViewController:self];

self.currentPageIndex = 0;

self.currentPageController = [self pageForIndex:self.currentPageIndex];
self.currentPageController.delegate = self;
[self.pageViewController setViewControllers:@[self.currentPageController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
Run Code Online (Sandbox Code Playgroud)

我试过调用,setNeedsLayout但这是一个笨拙的旋转动画,我刷到的下一页也没有正确调整大小.

为什么页面视图控制器没有调整其子视图控制器的大小,我该如何让它执行此操作?

谢谢!

constraints ios auto-rotation uipageviewcontroller autolayout

13
推荐指数
2
解决办法
3255
查看次数

在iOS 8中不推荐使用InterfaceOrientation

我没有在我的项目中使用Size类,并继续使用旧方法进行视图控制器方向.我收到了弃用警告,例如当我使用下面的代码时:

    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
      ...
    }
Run Code Online (Sandbox Code Playgroud)

我搜索了很多但找不到合适的方法来修复它.有什么建议 ?

uikit uiinterfaceorientation autorotate auto-rotation ios8

9
推荐指数
2
解决办法
8043
查看次数

用于youtube嵌入式视频的iOS 6.0+自动旋转

我想只在我的iOS应用程序的所有视图控制器中支持垂直方向.但是,我在我的一个视图控制器中嵌入了一个YouTube视频,当选择该视频占据整个屏幕时,我希望用户能够水平定位他/她的手机,以便视频扩展为全屏.

编辑:我尝试使用iOS 6中的Autorotate以下代码有奇怪的行为:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {

return self.fullScreenVideoIsPlaying ?
    UIInterfaceOrientationMaskAllButUpsideDown :
    UIInterfaceOrientationMaskPortrait;
Run Code Online (Sandbox Code Playgroud)

}

在我的视图控制器中显示UIWebView/ YouTube框架,我在我的代码中有这样的代码viewDidLoad:

[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(windowNowVisible:)
     name:UIWindowDidBecomeVisibleNotification
     object:self.view.window
];

- (void)windowNowVisible:(NSNotification *)notification
{
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    appDelegate.fullScreenVideoIsPlaying = !(appDelegate.fullScreenVideoIsPlaying);
}
Run Code Online (Sandbox Code Playgroud)

然而,当用户在全屏YouTube视频上按下完成时,如果他/她仍然水平地具有电话,则呈现视图控制器也保持水平(我希望当前视图控制器是肖像).这是fullSreenVideoIsPlaying变量的竞赛,它没有足够快地更新,因此我的呈现视图控制器是纵向的.

任何有关如何实现这一目标的反馈将不胜感激.

谢谢!

objective-c uiviewcontroller ios auto-rotation ios6

8
推荐指数
2
解决办法
3431
查看次数

如何避免iOS OpenGL ES应用程序自动旋转的瞬间拉伸

这最近一直困扰着我.将一个支持纵向和横向的OpenGL ES应用程序组合在一起非常简单.但是在自动旋转期间,系统似乎只是将渲染缓冲区强制拉伸到新的尺寸一次,自动旋转,然后调用通常的-layoutSubviews- > -resizeFromLayer:等等,这样可以将drawables调整到新的视口尺寸.

我见过的大多数支持肖像和风景的应用似乎都适合这种简单的方法.但我想知道我能不能做得更好......

也许我应该在它发生之前拦截自转(使用UIViewController常规方法),一旦渲染缓冲区"扩展"到最长屏幕尺寸的完美平方(例如,iPhone 5上的1136px x 1136px) - 这样它就会流血'关闭屏幕,执行自动旋转(没有渲染缓冲区尺寸变化,因此没有拉伸,就像在两个横向方向之间切换时一样),最后再次调整帧缓冲区以将不可见的"浪费"边距置于屏幕外?(当然我可以一直有一个方形的帧缓冲,但这样填充效率会很低)

有什么建议?有没有想过的更好的方法来实现这个目标?

编辑

我修改了我的-resizeFromLayer:代码如下:

CGRect bounds = [layer bounds];

// Enlarge layer to square of the longest side:
if (bounds.size.width < bounds.size.height) {
    bounds.size.width = bounds.size.height;
}
else{
    bounds.size.height = bounds.size.width;
}

[layer setBounds:bounds];


// Adjust size to match view's layer:
[_mainContext renderbufferStorage:GL_RENDERBUFFER
                         fromDrawable:(CAEAGLLayer*) [_view layer]];

// Query the new size:
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);

// (etc., you know the drill...) …
Run Code Online (Sandbox Code Playgroud)

opengl-es aspect-ratio ios auto-rotation

8
推荐指数
1
解决办法
1611
查看次数

取消呈现的视图控制器的交互式解雇转换后,视图控制器不会自动旋转

我有一个视图控制器呈现另一个视图控制器modalPresentationStyle = UIModalPresentationCustom.设置的内容使得呈现视图控制器视图的一部分显示在呈现的视图控制器视图下方.在此状态下,呈现视图控制器仍然可以正确处理自动旋转,并使用autolayout处理呈现的视图控制器的旋转.

我现在正尝试使用iOS 7的自定义视图控制器转换API以交互方式实现解除呈现的视图控制器.它的工作原理除外,当取消交互式解雇时,自动旋转的处理停止工作.(它会在稍后解除所呈现的视图控制器之后再次工作.)为什么会发生这种情况,我该如何解决这个问题?

编辑:这是您可以运行以演示问题的代码.从下面弹出一个视图,您可以通过向下滑动来消除它.如果通过不完全向下滑动来取消解雇,则呈现视图控制器的视图不再响应旋转,并且呈现的视图控制器的视图具有混乱的布局.

编辑:以下是作为Xcode项目的代码链接:https://drive.google.com/file/d/0BwcBqUuDfCG2YlhVWE1QekhUWlk/edit? usp =sharing

对于大规模的代码转储感到抱歉,但我不知道我做错了什么.这是一个正在发生的事情的草图:ViewController1礼物ViewController2.ViewController1实现UIViewControllerTransitioningDelegate,因此它返回动画/交互控制器的转换.ViewController2有一个平移手势识别器,驱动互动解雇; 它实现UIViewControllerInteractiveTransitioning了作为解雇的交互式控制器.如果用户将视图拖得足够远,它还会保留对动画控制器的引用以解除转换以完成转换.最后,有两个动画控制器对象.PresentAnimationController设置autolayout约束以处理呈现的视图控制器视图的旋转,并DismissAnimationController完成解雇.

ViewController1.h

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController <UIViewControllerTransitioningDelegate>

@end
Run Code Online (Sandbox Code Playgroud)

ViewController1.m

#import "ViewController1.h"

#import "ViewController2.h"

#import "PresentAnimationController.h"
#import "DismissAnimationController.h"

@implementation ViewController1

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = @"View 1";

        self.navigationItem.prompt = @"Press “Present” and then swipe …
Run Code Online (Sandbox Code Playgroud)

iphone uiviewcontroller ios auto-rotation ios7

8
推荐指数
1
解决办法
1313
查看次数

Autolayout和设备定位

我正在开发一个应用程序supports portrait and landscape modes.我在用auto layout to arrange my views.因为我一直在阅读很多帖子,并且我已经意识到开发人员通常使用以下方法之一.

1.第一种方法:

UIViewController:updateConstraints根据设备方向实现方法并更新约束.

2.第二种方法:

UIViewController:viewWillLayoutSubviews根据设备方向实现方法并更新约束.

谁能告诉我最好的使用方法是什么?我一直在寻找一种结合自动旋转和自动布局的最佳实践.谢谢.

iphone device-orientation ios auto-rotation autolayout

7
推荐指数
2
解决办法
7147
查看次数

iOS 8与iOS 7 Autorotation

这是一个简单的单视图控制器应用程序:

    - (void)viewDidLoad
    {
      [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

      self.view.backgroundColor = [UIColor greenColor];
     }


    - (BOOL)shouldAutorotate
    {
       return YES;
    }

    - (NSUInteger)supportedInterfaceOrientations
   {
        return UIInterfaceOrientationMaskLandscapeRight;
   }
Run Code Online (Sandbox Code Playgroud)

iOS 8中的输出是如此不同.

iOS 8输出

iOS 7输出

这与iOS 8与iOS 7的UIWindow界限有什么关系.我如何获得iOS 7的行为?

uiviewcontroller uiwindow auto-rotation ios7.1 ios8

6
推荐指数
1
解决办法
4193
查看次数

为什么我的子视图根据设备方向无法正确居中?

我正在尝试以编程方式创建一个自定义视图控制器,其子视图位于屏幕中心.我已成功,当我导航到此视图时,居中视图显示在中心,并在旋转设备时正确旋转.

但是,在此导航应用程序中,如果我在处于纵向模式时进入自定义视图,则应该居中的视图会将自身定位在不是屏幕中心的位置.我已经把所有的意见,控制器,父母,奶奶,圣母必要的自动调整大小属性...我已经跑出来的东西粘在自动调整大小面具,仍然例子很糟糕.

我确定我错过了一些可以解决所有问题的神奇方法的调用,但我还没想到要调用什么或者在哪里(setNeedsDisplay?setNeedsLayout?).为了展示这个问题我已经创建了一个提供完整的例子https://github.com/gradha/iPhone-centered-rotation-test您可以克隆,并在模拟器或设备上运行.我是从Apple的导航控制器创建的,只需添加一个假的单元格来推动我手动创建的视图.

定制视图可以被发现在https://github.com/gradha/iPhone-centered-rotation-test/blob/master/Classes/CenteredViewController.m这里是负责创建的中心子视图的方法的loadView:

/* Try to force the parent view to be as we want it. */
self.view.backgroundColor = [UIColor yellowColor];
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight |
    UIViewAutoresizingFlexibleWidth;

/* Top left blue square, for reference. */
blue_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 130, 130)];
[self.view addSubview:blue_];
blue_.backgroundColor = [UIColor blueColor];
[blue_ release];

/* Create red centered rectangle. */
red_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
red_.backgroundColor = [UIColor redColor];
red_.autoresizingMask = …
Run Code Online (Sandbox Code Playgroud)

iphone rotation uiviewcontroller uiview auto-rotation

5
推荐指数
1
解决办法
6652
查看次数