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

sub*_*t_x 16 iphone views objective-c ios

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

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

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

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Run Code Online (Sandbox Code Playgroud)

但是,如果使用在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];  
}
Run Code Online (Sandbox Code Playgroud)

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

- (void)updateInterface {
    [polygonView setPolygon:shape];
    [polygonView setNeedsDisplay];
...
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Sus*_*cob 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];
Run Code Online (Sandbox Code Playgroud)

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

viewController.view = polygonView;
Run Code Online (Sandbox Code Playgroud)

祝好运!