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

Posted

技术标签:

【中文标题】Monotouch - UIActionSheet 无法在 iPad 上正确显示【英文标题】:Monotouch - UIActionSheet not displaying correctly on iPad 【发布时间】:2012-09-30 14:38:55 【问题描述】:

我有一个 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 模拟器时得到了类似于所附屏幕截图的内容。

作为参考,这是使用 iPhone 模拟器时 UIActionSheet 的外观。

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

任何指点或帮助将不胜感激!

【问题讨论】:

当btnSay被触摸时,tmpBtn.Frame是什么? tmpView 呢?我猜你想在 btnSay.Superview 中显示来自 btnSay.Frame 的 actionSheet。 嗨 Jacob,tmpBtn.Frame 是主视图上按钮的框架/矩形。 tmpView 本质上只是“视图”,即当前显示的主视图。我会试试你说的 - 谢谢! 嗨,Jacob,对不起,我看到你现在在说什么 - 之前有点匆忙。是的,就目前而言,我已经尝试像这样显示 actionSheet - 使用 3 x 参数 - 按钮 btnSay.Frame 的框架,按钮的超级视图,以及动画与否的真/假。像这样,我遇到了上面截图中描述的问题。 【参考方案1】:

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

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

我用下面的代码来检测这是否是iPad,如果是,则调整popover view的frame:

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(普通和 DatePicker)

【讨论】:

您好 Macropus,感谢您发布您的解决方案。明天我会试一试,然后报告。我的问题实际上是修改框架本身 - 所以这看起来很有希望! 嗨,Macropus,很抱歉没有就此回复您 - 我尝试了一下,没有任何运气,但认为我这边有问题 - 我被赶上了在业务中并计划再次尝试 - 可能在周末。一旦我有更好的外观,我会尽快回到这里! (可能在接下来的一周内)。感谢您回来查看。

以上是关于Monotouch - UIActionSheet 无法在 iPad 上正确显示的主要内容,如果未能解决你的问题,请参考以下文章

从 UIActionSheet 访问 UIPopoverController

UIActionSheet 只显示一次

swift 创建第一个UIAlertView 和UIActionSheet

iOS:简单使用UIAlertVIew和UIActionSheet

如何知道视图层次结构中是不是显示 UIActionSheet?

UIActionSheet 中途出现