在IOS中以编程方式创建视图(它是如何工作的)?

时间:2011-01-27 18:07:04

标签: iphone objective-c ios views

一点背景:我正在浏览CS193P的iTune视频,而且我被困在作业3上的时间最长。基本上,作业要求您以编程方式创建自定义视图以在屏幕上显示形状。顺便说一下,我没有使用任何视图控制器。

在我最终在Interface Builder中拖动View对象并将对象名称更改为自定义视图类之前,我无法显示我的视图。所以我的问题是当人们说以编程方式创建视图时,他们只是说手动创建类,但是当你需要显示它时使用IB吗?我不禁觉得我误解了什么?

编辑:让我更清楚。我的自定义视图已使用0,0,200,150的框架初始化,并且drawRect被覆盖以在其中绘制正方形。如果尝试将其添加到我的控制器中的主窗口,我的视图甚至都不显示:

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];

但是,如果使用在IB中拖动视图并将类更改为我的视图类,则显示正常。

编辑:添加了一些代码。这是我的控制器的awakeFromNib方法,应该绘制视图。

    - (void)awakeFromNib {
    shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
    polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    polygonView.backgroundColor = [UIColor blackColor];
    [window addSubview:polygonView];
    [self updateInterface];  
}

我的控制器的updateInterface方法的一部分:

- (void)updateInterface {
    [polygonView setPolygon:shape];
    [polygonView setNeedsDisplay];
...
}

PolygonView.h

#import <UIKit/UIKit.h>
#import "PolygonShape.h"

@interface PolygonView : UIView {
    IBOutlet PolygonShape *polygon; 
}

@property (readwrite, assign) PolygonShape *polygon;

- (void)drawRect:(CGRect)rect;
@end

PolygonView.m

#import "PolygonView.h"

@implementation PolygonView
@synthesize polygon;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        nslog(@"initialized");
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
       CGRect bounds = [self bounds];

    [[UIColor grayColor] set];
    UIRectFill(bounds);

    CGRect square = CGRectMake(10, 10, 10, 100);
    [[UIColor blackColor] set];
    UIRectFill(square);

    [[UIColor redColor] set];
    UIRectFill(square);
    NSLog(@"drawRect called");
}
@end

正在初始化polygonView,但未调用drawRect。

8 个答案:

答案 0 :(得分:17)

为了更具体地解决您的问题,语法将是

UIWindow* window = [UIApplication sharedApplication].keyWindow;

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)];
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor];

[window addSubview:polygonView];
[polygonView release];

这是一种模式,不仅可用于此,还可用于子视图。另外,另一个注意事项是许多模板,viewController已经设置了它自己的视图。当你想创建一个自定义视图时,你可以像上面那样创建它,但不是上面的方法,而是将viewControllers视图设置为新创建的视图,如下所示:

viewController.view = polygonView;
祝你好运!

答案 1 :(得分:4)

这是一个老问题,但我不确定他是否得到了他所期望的答案 - 听起来他遇到了我在创建UIViewController子类时遇到的同样问题,打了一个{{1}在接口构建器nib中,但后来无法弄清楚如何使两者相互协作。

如果您单独制作了笔尖(因此它不是为您提供的,那么您必须记住单击放置在界面构建器中的UIViewController,然后从属性面板中单击第三个选项卡按钮( '自定义类')。 UIViewController将是默认基类Class等 - 只需打开此下拉列表,您将看到所有自定义子类的列表,选择它和volla - 您已链接自定义元素到界面。

希望能节省一些人花费的时间,我找到了一些愚蠢的方法来解决它,直到我意识到这个简单的解决方案。

答案 2 :(得分:2)

您需要有一个视图(或窗口)来添加子视图。正常的语法是这样的:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];

当然,如果你有一个继承自UIView的自定义对象,你可以使用它而不是UIView。当您启动一个新项目时,创建一个“基于视图的应用程序”,它将启动您带有关联视图的视图控制器(可以使用“CustomViewController.view”访问,它将替换代码段中的“mainView”)上文)。

如果要在应用程序启动时以编程方式创建视图,请将代码放在视图控制器的“ - (void)viewDidLoad”方法中。

答案 3 :(得分:2)

嗨,只需添加此代码,

[window bringSubviewToFront:polygonView];

right after,
 [window addSubview:polygonView];

答案 4 :(得分:0)

在您的活动控制器类中的某个位置,您可以将自定义视图添加到当前顶级视图。

[ myCurrentTopView addSubview: myNewCustomView ];

首先分配和初始化此自定义视图很有帮助。

然后,您可以通过执行以下操作在此自定义视图的drawRect中触发一些绘图:

[ myNewCustomView setNeedsDisplay ];

答案 5 :(得分:0)

您是否将视图的背景颜色设置为可区分的颜色?

你确定你的视图没有显示,或者只是你看不到它?将NSLog放在视图的drawRect:方法中(如果使用自定义视图类)。

答案 6 :(得分:0)

我最近遇到了一个非常类似的问题,这对我有用: 似乎在Xcode 4.3.2中以“空应用程序”开始时,您必须使用setRootViewController方法而不是addSubview将视图设置为主窗口的根视图。所以:

// Initialize myView and then
[window setRootViewController:myView];
// instead of [window addSubview:myView];
// the rest as normal...
[window makeKeyAndVisible];

之后,您可以使用addSubview方法添加其他视图。

答案 7 :(得分:0)

呼叫

[super drawRect];

在drawRect:body中的自定义代码之前。