web-dev-qa-db-ja.com

プログラムでカスタムビュークラスを作成するにはどうすればよいですか?

いくつかの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

しかし、私はそれをプログラムで行う必要があります、助けてください。ありがとう

13
Ezimet

これが簡単な方法です。お役に立てば幸いです。

//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
 }


29
Shankar BS

あなたは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メソッドは適切なタイミングで呼び出され、それに応じてレイアウトされます。

5
Mike Weller

クラスを更新して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;
}
3
Wain

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;
2
Zeke