loadNibNamed与initWithFrame设置框架高度和宽度的困境

时间:2012-07-29 10:45:26

标签: ios uiview loadnibnamed initwithframe designated-initializer

我创建了一个与.xib文件关联的UIView子类。这个UIView子类将在UIViewController中使用。在控制器中,我认为我们实例化UIView子类有两种选择:

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 

我更喜欢允许我执行自定义初始化的第一种方法或其变体。唯一的问题是我必须指定一个框架的rect,它已在。xib中指定(我的意思是框架的高度和宽度MyUIView)。是的,我可以在aRect中再次对其进行硬编码,但这很难维护(例如,当我在.xib中更改UI的位置时,我也必须更新aRect。)

因此,当自动设置frame rect时,应该考虑第二种方法。剩下的问题是我无法自定义初始化程序(比方说,我想在初始化期间传递额外的参数)。

您的偏好是什么?你认为哪一个更好?

EDIT1: 受到塞尔吉奥答案的启发,我推出了这个解决方法:

// 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;
}

1 个答案:

答案 0 :(得分:5)

您是否尝试过使用:

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

  }