UIButtonの隠しAPIを呼んでみる

本家SDKだとUIButtonのbuttonWithTypeに100以上の値を指定することで特殊なボタンを作ることができる。これをMonoTouchでやってみた。

using MonoTouch.ObjCRuntime;
using MonoTouch.UIKit;
using MonoTouch.Foundation;

public static class UIGlassButton
{
	private static IntPtr buttonHandle;
	private static IntPtr selSetTintColor;

	static UIGlassButton ()
	{
		buttonHandle = Class.GetHandle ("UIButton");
		selSetTintColor = Selector.GetHandle ("setTintColor:");
	}

	public static UIButton CreateGlassButton (int type)
	{
		NSObject button = Runtime.GetNSObject (Messaging.IntPtr_objc_msgSend_int (buttonHandle, Selector.GetHandle ("buttonWithType:"), type));
		return (UIButton)button;
	}

	public static void SetTintColor (this UIButton button, UIColor color)
	{
		if (button.GetType ().Assembly == NSObject.MonoTouchAssembly) {
			Messaging.void_objc_msgSend_IntPtr (button.Handle, selSetTintColor, color.Handle);
		} else {
			Messaging.void_objc_msgSendSuper_IntPtr (button.Handle, selSetTintColor, color.Handle);
		}
	}
}

実際にボタンを作るときはこのようになる。

UIButton btn1 = UIGlassButton.CreateGlassButton(100);
btn1.Frame =new RectangleF(10,30,120,31);
btn1.SetTitle("button", UIControlState.Normal);
window.AddSubview(btn1);


追記 2011/08/02
指定できるボタン番号、SetTintColorが有効かどうか、大きさ変更が有効かどうかを纏めてみた。(SDKの最小バージョンはv3.0)

番号 SetTintColor Frame
100 ×(Heightは固定、Widthは自動)
101 △(ボタンの形状が変わる) ×(Heightは固定、Widthは自動)
102 ×(Heightは固定、Widthは自動)
110 ×
111
112 ×(Heightは固定、Widthは自動)
113 ×
114 ×
115 ×

SetTintColorでUIColor.Greenを指定した時


追記 2012/03/28
iOS5.1でいくつかのボタンが使えなくなった(ラベルだけ表示される)。

番号 SetTintColor Frame
100 ×(Heightは固定、Widthは自動)
101 △(ボタンの形状が変わる) ×(Heightは固定、Widthは自動)
102 ×(Heightは固定、Widthは自動)
110 ×
111(使えなくなった)
112(使えなくなった)
113 ×
114 ×
115 ×


ご利用はくれぐれも自己責任で。