いくつかのUIlabelが付いた非常に単純なcustomViewを作成したいのですが、どうすればよいですか。チュートリアルや提案をいただければ幸いです。私はこれに不慣れで、以前は試していませんでした。
私はこれをxibで試しました。
@interface MyCustomView : UIView
@property (strong, nonatomic) IBOutlet UILabel *Label;
@end
実装
#import "MyCustomTimer.h"
@implementation MyCustomView
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0]];
}
return self;
}
@end
しかし、私はそれをプログラムで行う必要があります、助けてください。ありがとう
これが簡単な方法です。お役に立てば幸いです。
//in subclassed UIView
#import "CustomView.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
// initilize all your UIView components
UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(20,30, 200, 44)];
label1.text = @"i am label 1";
[self addSubview:label1]; //add label1 to your custom view
UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(20,80, 200, 44)];
label2.text = @"i am label 2";
[self addSubview:label2]; //add label2 to your custom view
[label1 release];//i am using without ARC, comment if u are using ARC
[label2 release];//i am using without ARC, comment if u are using ARC
}
return self;
}
// in your class where u want to use that view
#import "ViewController.h"
#import "CustomView.h"//import it
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//create your view where u want
CustomView *cv = [[CustomView alloc]initWithFrame:CGRectMake(10, 10, 230, 400)]; //create an instance of your custom view
[self.view addSubview:cv]; // add to your main view
[cv release];//comment if u are using ARC
}
あなたはXIBを使いたくないし、それをすべてプログラムでやりたいと言っています。
initWithFrame:
メソッドを実装する必要があります。
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
// create/initialize your subviews here
self.myLabel = [[UILabel alloc] init...];
// configure the label
self.myLabel.font = ...;
self.myLabel.autoresizingMask = ...;
[self addSubview:self.myLabel];
}
return self;
}
したがって、コントロール(フォント、色、自動サイズ変更マスクなど)を作成および構成し、それらをすべてinitWithFrame:
メソッドからサブビューとして追加します。物事をきれいに保つために、コードをさまざまなメソッドに分割したいと思うかもしれません。
自動レイアウトを使用している場合は、initメソッドからすべての制約を作成する必要もあります。
自動レイアウトを使用していない場合は、-layoutSubviews
メソッドを実装する必要があります。これは、サブビューをレイアウトするために適切なタイミングで呼び出されます(たとえば、ビューのフレームが変更されたとき)。
- (void)layoutSubviews
{
self.myLabel.frame = ...;
}
layoutSubviews
メソッドから、self.bounds
にアクセスして、その時点でのビューのサイズを把握できます。これにより、物事を正しく整列または折り返すために必要な幅/高さがわかります。
ビューのインスタンスを作成する場合は、[[MyCustomView alloc] init]
(空のrectでinitWithFrame:
を呼び出します)または[[MyCustomView alloc] initWithFrame:...]
を使用するだけです。フレームを設定し、ビューに追加します。 layoutSubviews
メソッドは適切なタイミングで呼び出され、それに応じてレイアウトされます。
クラスを更新してinitWithFrame:
とinitWithCoder:
を実装すると、次のように呼び出すことができます。
[[MyCustomView alloc] initWithFrame:...];
あなたのコードで。したがって、プログラムでインスタンス(構成済み)を作成しました。
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
UILabel *label = [[UILabel alloc] initWithFrame:...];
// configure the label
[self addSubview:label];
}
return self;
}
UIViewをサブクラス化する独自のクラスを作成してから、initWithFrameまたはdrawRectをオーバーライドします。初心者にとっては、initWithFrameのオーバーライドが簡単です。
ヘッダー(.h)ファイルは次のように始まる必要があります。
@interface YourOwnView : UIView
...
@end
次に、実装ファイル(.m)で、独自のinitWithFrameを実装する必要があります。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
//ADDING NEW CONTENT
UILabel *yourLabel = [[UILabel alloc]init];
//CUSTOMIZE your label's font, text, etc.
....
//Add your label to your own view
[self addSubview:yourLabel];
}
return self;
}
ラベルのテキストなど、初期化子に追加のデータまたはオプションが必要になる場合があります。この場合、次のような追加の引数を使用してinitメソッドを定義できます。
- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText;