【问题标题】:How to convert icons from UIBarButtonSystemItem into a UIImage in Xamarin iOS如何在 Xamarin iOS 中将 UIBarButtonSystemItem 中的图标转换为 UIImage
【发布时间】:2019-02-22 23:28:23
【问题描述】:

我正在尝试将 UIBarButtonSystemItem like UIBarButtonSystemItem.Camera 类型的图标转换为 UIImage。 用户可以在 Swift and ObjC 中做到这一点,但我无法弄清楚。

当我按照 Swift 和 ObjC 教程中的说明进行操作时,我的代码中出现空引用异常错误

{
    UIImage image = null;

    viewController.InvokeOnMainThread(() =>
    {
        UIBarButtonItem oldItem = viewController.NavigationItem.RightBarButtonItem;
        var buttonItem = new UIBarButtonItem(item);

        // Add to toolbar and render it
        viewController.NavigationItem.RightBarButtonItem = buttonItem;
        var x = new ObjCRuntime.Selector("view");
        var y = viewController.NavigationItem.RightBarButtonItem.PerformSelector(x);
        UIView itemView = (UIView)y;

        // Get the image from real UIButton
        foreach (var view in itemView.Subviews)
        {
            if (view.GetType() == typeof(UIButton))
                image = ((UIButton)view).ImageView.Image;
        }
                viewController.NavigationItem.RightBarButtonItem = oldItem;
    });

    return image;
}

我也试过了,

public static UIImage ToUIImage2(UIBarButtonSystemItem item, UIViewController viewController)
{
    UIImage image = null;

    viewController.InvokeOnMainThread(() =>
    {
        var buttonItem = new UIBarButtonItem(item);
        // Add to toolbar and render it
        var tempItem = new UIBarButtonItem[1] { buttonItem };
        var bar = new UIToolbar();
        bar.SetItems(tempItem, false);
        bar.SnapshotView(true);

        // Get the image from real UIButton
        var buttonItemView = bar.ValueForKey(new Foundation.NSString("view"));
        var itemView = (UIView)buttonItemView;

        foreach (var view in itemView.Subviews)
        {
            if (view.GetType() == typeof(UIButton))
                image = ((UIButton)view).ImageView.Image;
        }
    });
    return image;
}

在 StackOverflow 中找不到 C# 的任何内容。 以前有人试过吗?

【问题讨论】:

  • “我遇到了错误” - 你遇到了什么错误?并请在正文中发布相关代码,不要只链接到场外资源
  • 嘿杰森!谢谢你们的cmets!我根据您的建议更新了我的问题,在这两种情况下我都得到了一个空引用异常

标签: c# ios xamarin xamarin.ios


【解决方案1】:
public extern static IntPtr IntPtr_objc_msgSend (IntPtr receiver, IntPtr selector);

public static UIImage GetImage (UIBarButtonSystemItem systemItem)
{
    var tempItem = new UIBarButtonItem (systemItem);

    // Add to toolbar and render it
    var bar = new UIToolbar ();
    bar.SetItems (new [] { tempItem }, false);
    bar.SnapshotView (true);

    // Get image from real UIButton
    var selHandle = Selector.GetHandle ("view");
    var itemView = Runtime.GetNSObject<UIView>(IntPtr_objc_msgSend (tempItem.Handle, selHandle));
    foreach    (var view in itemView?.Subviews) {
        if (view is UIButton button)
            return button.ImageForState (UIControlState.Normal);
    }

    return null;
}

Xamarin iOS Gitter 中 @DaleXSoto 提供的解决方案

“问题是你正在调用一个选择器(视图)到 tempItem 对象 但这是一个 hack,因为 UIBarButtonItem 响应视图只是因为有人发现了,嘿,它不在标题上

所以 IntPtr_objc_msgSend 是您在 tempItem 对象上调用视图的方式"

【讨论】:

  • 你可以标记你的答案,让更多的人看到它
  • 嘿@LucasZhang-MSFT!我是新手。你是这个意思吗?
  • 是的,编码愉快:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2018-09-14
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2012-10-23
相关资源
最近更新 更多