![](/img/trans.png)
[英]how to convert image in a byte[] array to Xamarin.IOS UIImage control
[英]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.