当前位置: 首页 > 知识库问答 >
问题:

iOS8 UIActionSheet忽略视图控制器支持的InterfaceOrientations并应自动旋转

壤驷子安
2023-03-14

我有一个通过plist文件配置的应用程序,以支持纵向、横向左侧和横向右侧方向(即,UISupportedInterfaceOrientationPortrait、UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight)。但我已经将支持的方向限制为仅在视图控制器内部纵向。如果我在视图控制器的视图上显示UIActionSheet,然后旋转设备,UIActionSheet将旋转到新的方向。这仅在运行iOS 8(GM Seed)的设备上发生。

我希望UIActionSheet遵循包含视图控制器的规则,而不是旋转。思想?

UIViewController示例代码:

- (IBAction)onTouch:(id)sender
{
    UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"hi"
                                                       delegate:nil
                                              cancelButtonTitle:@"Cancel"
                                         destructiveButtonTitle:nil
                                              otherButtonTitles:@"Open", nil];

    [actionSheet showInView:self.view];
}

#pragma mark - Rotation methods

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

共有3个答案

萧德庸
2023-03-14

被告知UIAlertController将取代iOS 8中的UIActionSheet。

“新的UIAlertController类取代UIActionSheet和UIAlertView类,成为在应用程序中显示警报的首选方式。”

https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"hi"
                                                                          message:nil
                                                                   preferredStyle:UIAlertControllerStyleActionSheet];

[alertController addAction:[UIAlertAction actionWithTitle:@"Open"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction *action) {
                                                   // open something
                                                }]];

[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
                                                  style:UIAlertActionStyleCancel
                                                handler:nil]];

[self presentViewController:alertController animated:YES completion:nil];
饶德元
2023-03-14

我在iOS 8上也遇到了类似的问题,如果您现在想继续使用UIAlertView和UIActionSheet,而不是迁移到UIAlertController,我找到了一个解决方法,这可能会有所帮助。

我的应用程序允许横向和纵向,但仅在选定视图上。大多数时候它只允许纵向。我希望UIAlertView和UIActionSheet仅显示纵向(因为它们所在的视图仅允许纵向)。

不幸的是,在iOS 8中,警报和操作表现在会旋转,而忽略了窗口根视图控制器的shouldAutorotate方法。即使警报旋转,警报下方的视图和状态栏仍保持纵向可见。如果警报接受输入,键盘也会保持纵向,因此它确实没有吸引力。

我正准备放弃,但最终找到了一些有效的东西,即使它并不理想。将此放在您的应用程序委托中,并根据需要进行调整。我期待更好的解决方案(可能只是使用新类)。这里的字符串比较显然是蹩脚的,这将覆盖您在I中设置为支持的方向的任何内容nfo.phtml" target="_blank">list.至少它是可以继续下去的东西...

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSString *viewControllerClassName = [NSString stringWithUTF8String:object_getClassName(window.rootViewController)];
    if ([viewControllerClassName isEqualToString:@"_UIAlertShimPresentingViewController"])   {
        return UIInterfaceOrientationMaskPortrait;
    }
    else {
        return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
    }
}

在此处阅读有关此委托的更多信息:

https://developer.apple.com/library/prerelease/iOS/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:supportedInterfaceOrientationsForWindow:

邓德惠
2023-03-14

以下是我基于Busrod解决方案的变通方法,但做了一些修改,因为我在UIActionSheet中使用他的变通方法时遇到了一些问题:

-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UIViewController *presentedViewController = window.rootViewController.presentedViewController;
    if (presentedViewController) {
        if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
            return UIInterfaceOrientationMaskPortrait;
        }
    }
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
 类似资料:
  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 我有一个ASP.NET Core2.1Web应用程序,它通过Web API接口为DevExpress报告提供服务。 谢谢斯文

  • 动画控制器视图 动画控制器视图允许你创建、查看和修改动画控制器资源。 动画控制器视图显示了一个新的空动画控制器资源 动画控制器视图主要有两部分:网格布局主体区域,左侧的分层和参数面板。 动画控制器视图的布局区域 深灰色网格部分是主体布局区域。你可以在这里创建、排列和连接 动画控制器 的状态(即动画剪辑)。 可以在网格上右键点击创建一个新的状态节点。使用鼠标中键拖动,或拖动时按住 Alt/Optio

  • 我正在编写一个具有多个视图的iOS应用程序。我已经将应用程序设置为使用基于ViewController的状态栏样式,这允许我使用以下代码 这就像预期的那样。 然后我将视图嵌入到导航控制器中,并将Barbuttonite与showSegue连接起来。此后,视图的ViewController切换为忽略样式设置,并显示默认的黑色状态栏。

  • 我正在尝试将子视图控制器添加到父视图控制器,并让父视图控制器通知子视图控制器旋转事件。但是,旋转消息不会转发到子视图控制器(这是默认行为)。为什么没有发生这种默认行为? 环境:iOS 7、XCode 5、OSX 10.9 我正在按照Apple文档中的说明实现一个自定义容器视图控制器:“创建自定义容器视图控制器”。我试图建立一个简单的父子关系来转发旋转事件。总体层次结构与此处重新绘制的文档图14-1

  • 以下的一段代码相当于定义一个ParameterizableViewController视图控制器的快捷方式,该控制器会立即将一个请求转发(forwards)给一个视图。请确保仅在以下情景下才使用这个类:当控制器除了将视图渲染到响应中外不需要执行任何逻辑时。 以下是一个例子,展示了如何在MVC Java编程配置方式下将所有"/"请求直接转发给名字为"home"的视图: @Configuration