gpt4 book ai didi

ios - Xamarin iOS 自定义 View

转载 作者:可可西里 更新时间:2023-11-01 05:43:21 26 4
gpt4 key购买 nike

我创建了一个自定义 View (从 UIView 派生的新类)。此 View 旨在用作我的 iOS 应用程序中的 header ,并且基本上包含两个名为“标题”和“副标题”的标签。我创建了两个匹配的字符串属性,可用于设置“标题”和“副标题”标签的文本。

我的问题是,将提供给属性的字符串值(假设使用与 MvvmCross 的绑定(bind)或只是简单的 iOS 设计器)分配给标签的 .text 属性的最佳位置是什么?

我知道当我覆盖 Draw(CGRect rect) 方法并在此处分配值时它会起作用(并在属性值时调用 SetNeedsDisplay() 方法改变)。然而,调用 Draw(CGRect rect) 对我来说听起来是错误的。任何帮助将不胜感激。

目前我有以下代码:

[Register("MenuHeaderView"), DesignTimeVisible(true)]
public class MenuHeaderView : UIView
{
private const int _margin = 5;

private UILabel _title;
private UILabel _subTitle;


public MenuHeaderView()
{
Initialize();
}

public MenuHeaderView(CGRect frame)
: base(frame)
{
Initialize();
}

public MenuHeaderView(IntPtr p)
: base(p)
{
Initialize();
}

[Export("Title"), Browsable(true)]
public string Title { get; set; }
[Export("SubTitle"), Browsable(true)]
public string SubTitle { get; set; }

private void Initialize()
{
AutoresizingMask = UIViewAutoresizing.FlexibleDimensions;

// Create 'Title' label
_title = new UILabel()
{
BackgroundColor = UIColor.Clear,
Font = UIFont.BoldSystemFontOfSize(UIFont.SystemFontSize),
TextAlignment = UITextAlignment.Left,
TextColor = UIColor.White,
Text = "Verbeterapp",
TranslatesAutoresizingMaskIntoConstraints = false
};

// Create 'SubTitle' label
_subTitle = new UILabel()
{
BackgroundColor = UIColor.Clear,
Font = UIFont.SystemFontOfSize(UIFont.SystemFontSize),
TextAlignment = UITextAlignment.Left,
TextColor = UIColor.White,
Text = "JCI",
TranslatesAutoresizingMaskIntoConstraints = false
};

this.AddSubviews(new UIView[] { _title, _subTitle });

SetNeedsUpdateConstraints();
}

public override void UpdateConstraints()
{
if (NeedsUpdateConstraints())
SetupContraints();

base.UpdateConstraints();
}

private void SetupContraints()
{
var constraints = new List<NSLayoutConstraint>();

var viewMetrics = new Object[] {
"titleLabel", _title,
"subTitleLabel", _subTitle,
"margin", _margin
};

constraints.AddRange(
NSLayoutConstraint.FromVisualFormat(
"V:[titleLabel]-margin-[subTitleLabel]",
NSLayoutFormatOptions.AlignAllLeading,
viewMetrics
)
);

constraints.Add(
NSLayoutConstraint.Create (
_title,
NSLayoutAttribute.Left,
NSLayoutRelation.Equal,
this,
NSLayoutAttribute.Left,
1,
8
)
);

constraints.Add (
NSLayoutConstraint.Create(
_title,
NSLayoutAttribute.CenterY,
NSLayoutRelation.Equal,
this,
NSLayoutAttribute.CenterY,
1,
-_subTitle.Frame.Height
)
);


AddConstraints(constraints.ToArray());
}
}

最佳答案

一如既往:这取决于您的要求(一个平台的小型应用程序/原型(prototype)或多个平台的大型应用程序)。因此,您的问题有点基于意见。

您是否只想一次分配文本?然后转到设计器或在代码中设置 Text 属性。剩下的问题是,您在每个支持的平台上复制您的文本值。你必须在 iOS、Android、UWP、Windows Phone 中设置它,......如果你想改变它,那将是一件痛苦的事情。

我更喜欢使用 MvvMCross 进行数据绑定(bind)。我们几乎在每个项目中都使用 MvvMCross(自 3 年以来),因为它提供了 View 、数据和服务的严格分离(使用 IoC、MvvM、数据绑定(bind)、插件、ViewModel 到 ViewModel 导航等现代方法)和大量抽象平台特定元素。数据绑定(bind)机制允许您毫不费力地更改查看的值。如果你想改变一个静态字符串,你只需要做一次。如果您是 Xamarin、Mobile 和/或 MvvM 的新手,它当然会增加一个可能难以理解的额外级别,但这是完全值得的。

关于ios - Xamarin iOS 自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35575135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com