案头见蠹鱼,犹胜凡俦侣。这篇文章主要讲述如何在MonoTouch中为继承的视图创建UIAppearance代理?相关的知识,希望能为你提供帮助。
我创建了一个UIButton
的子类,它充当UIBarButtonItem
中的自定义Back按钮:
- - - - - - - - - - - - - - - - -
|UIBarButtonItem||------------------------|
/|
|BackButton : UIButton ||
------------------------
|___________|
当我将我的代码切换到使用
UIAppearance
时,我注意到BackButton.Appearance
是毫无疑问的,继承自UIButton.Appearance
,因此更改它将改变整个应用程序中的所有UIButton
s,而不仅仅是我的自定义按钮。我知道我可以使用
AppearanceWhenContainedIn
但是,因为UIBarButtonItem
不是外观容器,我必须在它们之间插入另一个视图以识别后退按钮,我不想这样做。如何为我的自定义
UIAppearance
子类提供UIButton
代理,该子类具有UIButton.UIButtonAppearance
中的所有可用方法?我注意到它的构造函数是内部的。答案虽然可能有一个更简单的答案,但我最终直接从
UIAppearance
继承并从MonoDevelop C#反汇编程序中复制粘贴相关的UIButton
和UIButton+UIButtonAppearance
绑定实现,并在此处和那里修复内部字段。在
BackButton
内:static readonly IntPtr class_ptr = Class.GetHandle(typeof(BackButton));
public new static BackButtonAppearance Appearance
{
get {
return new BackButtonAppearance (Messaging.IntPtr_objc_msgSend (class_ptr, UIAppearance.SelectorAppearance));
}
}public new static BackButtonAppearance AppearanceWhenContainedIn (params Type[] containers)
{
return new BackButtonAppearance (UIAppearance.GetAppearance (class_ptr, containers));
}
嵌套的
BackButtonAppearance
:public class BackButtonAppearance : UIAppearance {
public BackButtonAppearance(IntPtr handle) : base(handle) { }// These are copied from UIButton disassembly:static readonly IntPtr selSetBackgroundImageForState_ = Selector.GetHandle ("setBackgroundImage:forState:");
static readonly IntPtr selSetTitleShadowColorForState_ = Selector.GetHandle ("setTitleShadowColor:forState:");
static readonly IntPtr selSetTitleColorForState_ = Selector.GetHandle ("setTitleColor:forState:");
// These are copied from UIButton+UIButtonAppearance disassembly,
// with internal UIButton.selSet* fields replaced by fields declared above.[Export ("setBackgroundImage:forState:"), CompilerGenerated]
public virtual void SetBackgroundImage (UIImage image, UIControlState forState)
{
UIApplication.EnsureUIThread ();
if (this.IsDirectBinding) {
Messaging.void_objc_msgSend_IntPtr_UInt32 (base.Handle, selSetBackgroundImageForState_, (image != null) ? image.Handle : IntPtr.Zero, (uint)forState);
} else {
Messaging.void_objc_msgSendSuper_IntPtr_UInt32 (base.SuperHandle, selSetBackgroundImageForState_, (image != null) ? image.Handle : IntPtr.Zero, (uint)forState);
}
}[Export ("setTitleColor:forState:"), CompilerGenerated]
public virtual void SetTitleColor (UIColor color, UIControlState forState)
{
UIApplication.EnsureUIThread ();
if (this.IsDirectBinding) {
Messaging.void_objc_msgSend_IntPtr_UInt32 (base.Handle, selSetTitleColorForState_, (color != null) ? color.Handle : IntPtr.Zero, (uint)forState);
} else {
Messaging.void_objc_msgSendSuper_IntPtr_UInt32 (base.SuperHandle, selSetTitleColorForState_, (color != null) ? color.Handle : IntPtr.Zero, (uint)forState);
}
}[Export ("setTitleShadowColor:forState:"), CompilerGenerated]
public virtual void SetTitleShadowColor (UIColor color, UIControlState forState)
{
UIApplication.EnsureUIThread ();
if (this.IsDirectBinding) {
Messaging.void_objc_msgSend_IntPtr_UInt32 (base.Handle, selSetTitleShadowColorForState_, (color != null) ? color.Handle : IntPtr.Zero, (uint)forState);
} else {
Messaging.void_objc_msgSendSuper_IntPtr_UInt32 (base.SuperHandle, selSetTitleShadowColorForState_, (color != null) ? color.Handle : IntPtr.Zero, (uint)forState);
}
}
}
这允许我带来我的自定义视图以支持UIAppearance风格的API。
另一答案为完整性添加答案。
【如何在MonoTouch中为继承的视图创建UIAppearance代理()】使用
BackButton.GetAppearance<
BackButton>
()
而不是BackButton.Appearance
。推荐阅读
- 平台android NDK不支持ABIs [armeabi,mips]
- 背景和暂停的app状态之间的混淆
- Application Wrapper必须以.app结尾。提交我的应用程序
- Android Realm初始设置
- 如何在NetBeans中自动为PHP类创建getter和setter
- 如何在Shopware中配置调试环境
- 如何在Symfony中使用FOSUserBundle在自定义控制器中注册用户
- 如何解决symfony 3错误给出类型为”字符串”,”yourBundle/Form/xformType”的预期参数
- 未设置Symfony 2默认时区会在生产环境中导致致命错误