loadNibNamed 对比initWithFrame 设置框架高度和宽度的困境
-
13-12-2019 - |
题
我创建了一个与 .xib 文件关联的 UIView 子类。这个 UIView 子类将在 UIViewController 中使用。在控制器中,我认为我们实例化 UIView 子类有两种选择:
MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
和
MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView"
owner:self
options:nil] lastObject];
我更喜欢第一种方法或其变体,它们允许我执行自定义初始化。唯一的问题是我必须指定框架的矩形,该矩形已在 .xib
(我的意思是框架的高度和宽度 MyUIView
)。是的,我可以再次对其进行硬编码 aRect
, ,但这维护起来很乏味(例如,当我更改 .xib 中 UI 的位置时,我必须更新 aRect
, , 也)。
因此,应该考虑第二种方法,因为框架矩形是自动设置的。剩下的问题是我无法自定义初始化程序(比如说,我想在初始化期间传递额外的参数)。
你的偏好是什么?您认为哪一个更好?
编辑1:受到塞尔吉奥回答的启发,我想出了这个解决方法:
// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];
// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView"
owner:self
options:nil] lastObject];
[self setFrame:CGRectMake(frame.origin.x,
frame.origin.y,
[self frame].size.width,
[self frame].size.height)];
// frame's width and height already determined after
// loadNibNamed was called
...
}
return self;
}
解决方案
您是否尝试过使用:
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];
我不知道它是否适用于您的情况(从笔尖加载视图),但当我以编程方式创建自定义视图时,我成功地使用了它。
你可以尝试一下。
编辑:
你可以定义你自己的 init
方法供您查看:
-(id)initWithPosition:(CGPoint)pos;
然后调用:
-(id)initWithPosition:(CGPoint)pos {
if (self = [super initWithFrame:{pos,{0,0}}]) {
self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView"
owner:self
options:nil] lastObject];
[self setFrame:CGRectMake(frame.origin.x,
frame.origin.y,
[self frame].size.width,
[self frame].size.height)];
// frame's width and height already determined
// after loadNibNamed was called
}
不隶属于 StackOverflow