首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Xamarin iOS中将图标从UIBarButtonSystemItem转换为UIImage

如何在Xamarin iOS中将图标从UIBarButtonSystemItem转换为UIImage
EN

Stack Overflow用户
提问于 2019-02-23 07:28:24
回答 1查看 287关注 0票数 0

我正在尝试将图标从UIBarButtonSystemItem like UIBarButtonSystemItem.Camera类型转换为UIImage。用户可以在Swift and ObjC中做到这一点,但我不能理解它。

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

代码语言:javascript
复制
{
    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;
}

我也试过了,

代码语言:javascript
复制
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#的任何内容。以前有没有人尝试过这样做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-23 08:12:48

代码语言:javascript
复制
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;
}

由@DaleXSoto提供的来自Xamarin iOS Gitter的解决方案

“问题是你在tempItem对象中调用了一个选择器(视图),但这是一个技巧,因为UIBarButtonItem响应视图只是因为有人发现它不在头上。

所以在tempItem对象上调用IntPtr_objc_msgSend就是这样做的。“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54836606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档