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 | × | ○ |
ご利用はくれぐれも自己責任で。