Monotouch - UIActionSheet无法在iPad上正确显示

时间:2012-09-30 14:38:56

标签: ipad mono xamarin.ios uiactionsheet

我有一个UIActionSheet,可以在iPhone模拟器上正常工作。当用户触摸UIButton时会显示它。

使用iPad,我相信UIActionSheets会被包装到UIPopupController中。

当我使用iPad模拟器调用相同的代码时,我会看到一条细线“线”,看起来像UIPopupController(你可以看到通常指向控件的小箭头)。没有任何内容可以看到。

使用带MonoTouch的iPad使用UIActionSheet的正确方法是什么?以下是我一直在测试的一些示例代码 - 创建UIActionSheet:

var actionSheet = new UIActionSheet () { Style = UIActionSheetStyle.BlackTranslucent };
        actionSheet.Frame = actionSheetFrame;
        actionSheet.Clicked += (s, e) => { Console.WriteLine ("Clicked on item {0}", e.ButtonIndex); };
actionSheet.AddSubview (doneButton);

然后,我通过从按钮调用以下内容来显示操作表:

btnSay.TouchUpInside += (sender, e) => {
            actionSheet.ShowFrom(tmpBtn.Frame, tmpView, false);
        };

在使用iPad模拟器时,我得到的是附带的截图。

iPad UIActionSheet example

供参考,以下是使用iPhone模拟器时UIActionSheet的样子。

iPhone UIActionSheet example

注意:该项目是一个通用的单视图MonoTouch c#项目。

非常感谢任何指针或帮助!

1 个答案:

答案 0 :(得分:6)

我在最近发布到应用程序商店的应用程序遇到了同样的问题。

当您在iPad上显示UIActionSheet时,iOS会将UIActionSheet包裹在UIPopoverView中。

我使用以下代码来检测这是否是iPad,如果是,请调整弹出视图的框架:

const int CHROMEWIDTHLEFT = 9;
const int CHROMEWIDTHRIGHT = 8;
const int MARGIN = 50;

UIActionSheet _actionSheet;

...

if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) {
    var popover = _actionSheet.Superview.Superview;
    if (popover != null)
    {
        var x = _actionSheet.Frame.X + MARGIN;
        var y = (UIScreen.MainScreen.ApplicationFrame.Height - _actionSheet.Frame.Height) / 2;
        var width = _actionSheet.Frame.Width - (MARGIN * 2);
        var height = _actionSheet.Frame.Height;

        popover.Frame = new RectangleF (x, y, width, height);
        _actionSheet.Frame = new RectangleF (x, y, width - (CHROMEWIDTHLEFT + CHROMEWIDTHRIGHT), height - (CHROMEWIDTHLEFT + CHROMEWIDTHRIGHT));
    }
}

该示例基于Xamarin ActionSheet日期选择器here

我把它们作为Gist(Normal和DatePicker)