以编程方式在IOS中创建视图(它是如何工作的)?
稍微背景:我正在浏览CS193P iTune视频,并且我在作业3上停留时间最长。基本上,分配会要求您以编程方式创建自定义视图以在屏幕上显示形状。顺便说一下,我没有使用任何视图控制器。以编程方式在IOS中创建视图(它是如何工作的)?
我无法让我的视图显示,直到我终于在Interface Builder中拖动一个View对象,并将对象名称更改为我的自定义视图类。所以我的问题是,当人们说以编程方式创建一个视图,他们只是说手动创建类,但是当你需要显示它使用IB?我不禁感到我误解了某些东西?
编辑:让我更清楚。我的自定义视图已用0,0,200,150帧初始化,并且drawRect被重写以在其中绘制方形。我的看法甚至不显示了,如果尝试我的控制器内将其添加到主窗口:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
但是,如果使用拖放在IB的视图,并更改类到我的视图类,它显示了罚款。
编辑:添加了一些代码。这是我的控制器的awakeFromNib方法,应该绘制视图。我控制器updateInterface方法
- (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];
}
部分:
- (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正在初始化,但ISN的drawRect不会被打扰d。
为了更加具体到你的问题,语法将
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;
祝你好运!
您需要有一个视图(或窗口)来添加子视图。正常的语法是这样的:
UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];
当然,如果你有一个从UIView的继承的自定义对象,你会用这个来代替的UIView。当你开始一个新项目时,创建一个“基于视图的应用程序”,它将使用一个带有关联视图的视图控制器来启动你(可以用“CustomViewController.view”来访问它,它将替换代码片段中的“mainView”以上)。
如果您想在应用程序启动时以编程方式创建视图,请将代码放置在视图控制器的“ - (void)viewDidLoad”方法中。
我知道一个视图控制器将会走的路,但在这个特定的任务中,只有一个模型类,一个控制器类和自定义视图类。你是说我必须将我的视图对象添加到主窗口?我将如何以及在哪里做到这一点? – 2011-01-27 18:18:48
在您的活动控制器类中的某处,您可以将自定义视图添加到当前顶级视图。
[ myCurrentTopView addSubview: myNewCustomView ];
它有助于首先分配和初始化此自定义视图。
然后,您可以通过触发该自定义视图的drawRect一些绘图一个:
[ myNewCustomView setNeedsDisplay ];
您是否将视图的背景颜色设置为可区分的?
您确定您的视图不显示吗?还是仅仅是您看不到它?将NSLog放入视图的drawRect:方法中(如果使用自定义视图类)。
这是一个古老的问题,但我不确定他是否得到了他期望的答案 - 这听起来像是他遇到了我在创建子类时所遇到的同样问题,在界面构建器笔尖中敲了一个UIViewController
但然后无法弄清楚如何让两个人一起工作。
如果你单独制作了笔尖(所以它不是为你和你的班级一起制作的),那么你必须记住点击你放置在界面生成器中的UIViewController,然后从属性面板中点击第三个标签按钮('自定义类')。 Class
将作为默认基类UIViewController
等 - 只需打开此下拉列表,您将看到所有自定义子类的列表,选择它和volla - 您已将自定义元素链接到界面。
希望能够拯救某些人,让我了解这些日子,我找到了一些愚蠢的奇妙方式来解决它,直到我意识到简单的解决方案。
最近我有一个非常类似的问题,这里是我的工作: 看来,当在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方法来添加其他视图。
喜只需添加此代码,
[window bringSubviewToFront:polygonView];
right after,
[window addSubview:polygonView];
呼叫
[super drawRect];
在drawRect中您的自定义代码之前:身体。
keyWindow在哪里被创建?如果你没有加载nib文件(从你的问题中不清楚你是否是),那么在添加子视图之前,你必须先创建窗口。 – jlehr 2011-01-27 22:24:14
它正在AppDelegate类中创建。这是否意味着我必须#import我的PolygonView类并在那里创建它? – 2011-01-28 05:13:22
有趣的是,如果我把我的视图的初始化和添加到我的updateInterface方法的窗口,它的工作原理,但只有当我点击一个调用该方法的按钮后。看起来好像代码不在awakeFromNib中进行处理。有任何想法吗? – 2011-01-28 18:44:24