强制UIActionSheet使用特定方向

时间:2011-11-11 21:40:10

标签: ios uiviewcontroller uiactionsheet uiinterfaceorientation

我的应用有一个无法改变方向的视图控制器。把它想象成一个需要保持固定的运动场。

我现在想提出一个UIActionSheet,但考虑到用户拿着设备的方式,我想将表格与方向匹配。

似乎UIActionSheet与MFComposerViewController不同,它不会从StatusBar获取它的方向,我根据方向旋转它,但从底层视图控制器获取它的方向。换句话说,UIActionSheet以纵向方式显示,无论设备如何被保持。

我试过了:

CGAffineTransform   t = CGAffineTransformMakeRotation(lastUIAngle);
[actionSheet setTransform:t];
if (UIInterfaceOrientationIsLandscape(lastOrientation))
    actionSheet.frame = CGRectMake(0, 0, 480, 320);
else 
    actionSheet.frame = CGRectMake(0, 0, 320, 480);
actionSheet.center = self.view.center;

我设法得到正确的方向,但最终的动作表从肖像方面出现,并且大小就像是纵向方向一样。操作表的框架是根据按钮数等计算的。

是否有人设法强制UIActionSheet以指定的方向正确显示?

(我也尝试创建一个新的视图,它被转换并具有正确的大小,但是UIActionSheet忽略了它。剩下的是创建一个自动旋转的新UIViewController,并让UIActionSheet成为它的子节点。但是,这意味着我的比赛区域被新的视图控制器完全遮挡了。)

2 个答案:

答案 0 :(得分:7)

事实证明答案非常简单。添加此代码以强制UIActionSheets到您想要的任何方向:

tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
tempView.transform = CGAffineTransformMakeRotation(lastUIAngle);
tempView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view.window addSubview:tempView];

UIActionSheet *actionSheet = ...

[actionSheet showInView:tempView];

lastUIAngle是pi / 2的倍数,在这种情况下,我从上次更改方向时保存了。

答案 1 :(得分:0)

检查此替代方案 - > JonasGessner/JGActionSheet如果您不介意基本布局,或者您可以在src代码中修改它。

这适用于iOS 8.0.2。如下所示:

  1. 将其包含在您的项目中。
  2. JGActionSheet.hJGActionSheet.m复制到您的项目

    1. 将其导入您要使用操作表的位置。
    2. #import "JGActionSheet.h"

      1. 使用它。
      2. 示例代码:

        JGActionSheetSection *menuSection = [JGActionSheetSection sectionWithTitle:nil message:@"Select Food" buttonTitles:@[@"Hamburger", @"Toast", @"Rice"] buttonStyle:JGActionSheetButtonStyleDefault];
        [menuSection setButtonStyle:JGActionSheetButtonStyleRed forButtonAtIndex:0];
        
        JGActionSheetSection *cancelSection = [JGActionSheetSection sectionWithTitle:nil message:nil buttonTitles:@[@"Cancel"] buttonStyle:JGActionSheetButtonStyleCancel];
        
        NSArray *sections = @[menuSection, cancelSection];
        JGActionSheet *sheet = [JGActionSheet actionSheetWithSections:sections];
        
        [sheet setButtonPressedBlock:^(JGActionSheet *sheet, NSIndexPath *indexPath) {
            [sheet dismissAnimated:YES];
        }];
        
        // Set specific orientation to action sheet
        sheet.transform = CGAffineTransformMakeRotation(M_PI);
        
        [sheet showInView:self.view animated:YES];