gpt4 book ai didi

ios - loadNibNamed 与 initWithFrame 两难设置框架的高度和宽度

转载 作者:行者123 更新时间:2023-12-01 17:43:53 27 4
gpt4 key购买 nike

我创建了一个与 .xib 文件关联的 UIView 子类。此 UIView 子类将在 UIViewController 中使用。在 Controller 中,我认为我们如何实例化 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];
我不知道它是否适用于您的情况(从 Nib 加载 View ),但是当我以编程方式创建自定义 View 时,我成功使用了它。
你可以试一试。
编辑:
你可以定义你自己的 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

}

关于ios - loadNibNamed 与 initWithFrame 两难设置框架的高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708597/

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