繁体   English   中英

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

[英]loadNibNamed vs. initWithFrame dilemma for setting frame's height and width

我创建了一个与.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再次对其进行硬编码,但是这很繁琐(例如,当我更改UI在.xib中的位置时,我也必须更新aRect )。

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

您的喜好是什么? 您认为哪个更好?

编辑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

  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM