我创建了一个自定义视图(从UIView派生的新类)。此视图用作我的iOS应用程序中的标题,基本上包含两个名为“Title”和“SubTitle”的标签。我创建了两个匹配的字符串属性,可用于设置“Title”和“SubTitle”标签的文本。
我的问题是,将提供给属性的字符串值(比如使用与MvvmCross绑定或仅仅是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());
}
}
答案 0 :(得分:3)
总之:它取决于您的要求(一个平台的小应用程序/原型或多个平台的更大应用程序)。因此,您的问题有点基于意见。
您想要一次分配文字吗?然后转到Designer或在代码中设置Text属性。剩下的问题是,您使用每个支持的平台复制文本值。你必须在iOS,Android,UWP,Windows Phone中设置它......如果你想改变它,那就太痛苦了。
我更喜欢与MvvMCross进行数据绑定。我们几乎在每个项目中使用MvvMCross(从3年开始),因为它提供了严格的视图,数据和服务分离(使用IoC,MvvM,数据绑定,插件,ViewModel到ViewModel导航等现代方法)和很多抽象特定元素。数据绑定机制允许您无任何痛苦地更改查看的值。如果要更改静态字符串,则只需执行一次。如果你是Xamarin,Mobile和/或MvvM的新手,它当然会增加一个可能难以理解的额外水平,但它是完全值得的。
答案 1 :(得分:0)
对于Xamarin.iOS,您可以尝试类似this.