【问题标题】:loadNibNamed vs. initWithFrame dilemma for setting frame's height and widthloadNibNamed 与 initWithFrame 两难设置框架的高度和宽度
【发布时间】:2012-07-29 10:45:26
【问题描述】:

我创建了一个与 .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;
}

【问题讨论】:

    标签: ios uiview loadnibnamed initwithframe designated-initializer


    【解决方案1】:

    您是否尝试过使用:

    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
       
      }
     
    

    【讨论】:

    • 这在我的情况下不起作用,因为我也想在 aRect 中传递 origin.xorigin.y,但无论如何谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多