簡體   English   中英

如何在Xamarin iOS中將圖標從UIBarButtonSystemItem轉換為UIImage

[英]How to convert icons from UIBarButtonSystemItem into a UIImage in Xamarin iOS

我正在嘗試將圖標從UIBarButtonSystemItem類型( 如UIBarButtonSystemItem.Camera)轉換為UIImage。 用戶能夠在Swift和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#的任何內容。 有人嘗試過嗎?

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對象調用選擇器(視圖),但這是一個駭客,因為UIBarButtonItem響應視圖只是因為有人發現了,但它不在標題中

因此,執行IntPtr_objc_msgSend就是在tempItem對象上調用視圖的方式”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM