少し背景:私はCS193P iTuneビデオを調べていますが、割り当て3に最も長い間立ち往生していました。基本的に、割り当てでは、プログラムでカスタムビューを作成して、画面に図形を表示するように求められます。ちなみに私はView Controllerを使用していません。
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は呼び出されていません。
あなたの質問をさらに具体的にするために、構文は次のようになります
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;
幸運を!
これは古い質問ですが、彼が期待した答えを得たかどうかはわかりません。UIViewController
サブクラスを作成してUIViewController
を作成したときと同じ問題が発生したようです。インターフェイスビルダーのnibでは、2つを相互に連携させる方法を理解できませんでした。
Nibを個別に作成した場合(クラスと一緒に作成されなかったため)、インターフェイスビルダーに配置したUIViewControllerをクリックし、プロパティパネルから3番目のタブボタン( 'カスタムクラス')。 Class
はデフォルトの基本クラスUIViewController
などになります-このドロップダウンリストを開くだけで、すべてのカスタムサブクラスのリストが表示されます。それを選択してvolla-リンクしましたインターフェイスへのカスタム要素。
私が理解するのにかかった日を誰かが救ってくれることを願って、私は簡単な解決策を実現するまでそれを回避する愚かな素晴らしい方法をいくつか見つけました。
こんにちは、このコードを追加します。
[window bringSubviewToFront:polygonView];
right after,
[window addSubview:polygonView];
サブビューを追加するビュー(またはウィンドウ)が必要です。通常の構文は次のとおりです。
UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];
もちろん、UIViewから継承するカスタムオブジェクトがある場合は、UIViewの代わりにそれを使用します。新しいプロジェクトを開始するときに、「ビューベースのアプリケーション」を作成します。これにより、関連付けられたビューを持つビューコントローラーが起動します(「CustomViewController.view」でアクセスできます。これは、コードスニペットの「mainView」を置き換えます)上記)。
アプリの起動時にプログラムでビューを作成する場合は、コードをビューコントローラーの「-(void)viewDidLoad」メソッドに配置します。
ビューの背景色を区別できるものに設定しましたか?
ビューが表示されないのですか、それとも単に表示されていないだけですか? NSLogをビューのdrawRect:メソッドに配置します(カスタムビュークラスを使用する場合)。
私は最近非常によく似た問題を抱えていましたが、これが私にとってうまくいきました:Xcode 4.3.2の「空のアプリケーション」で開始するとき、addSubviewの代わりにsetRootViewControllerメソッドを使用してビューをルートビューとして設定する必要があるようです。そう:
// Initialize myView and then
[window setRootViewController:myView];
// instead of [window addSubview:myView];
// the rest as normal...
[window makeKeyAndVisible];
その後、addSubviewメソッドを使用してビューを追加できます。
アクティブなコントローラークラスのどこかで、カスタムビューを現在の最上位のビューに追加できます。
[ myCurrentTopView addSubview: myNewCustomView ];
最初にこのカスタムビューを割り当てて初期化すると役立ちます。
次に、以下を実行することにより、このカスタムビューのdrawRectで描画をトリガーできます。
[ myNewCustomView setNeedsDisplay ];
コール
[super drawRect];
drawRect:bodyのカスタムコードの前。