14

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

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

4

5 に答える 5

5

あなたは、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 メソッドからすべての制約を作成する必要もあります。

autolayout を使用していない場合は、-layoutSubviewsメソッドを実装する必要があります。これは、サブビューをレイアウトするために適切なタイミングで呼び出されます (たとえば、ビューのフレームが変更されたとき)。

- (void)layoutSubviews
{
    self.myLabel.frame = ...;
}

メソッドからアクセスして、その時のビューのサイズを把握layoutSubviewsできます。self.boundsこれにより、物を正しく整列またはラップする必要がある幅/高さがどれだけあるかがわかります。

ビューのインスタンスを作成する場合は、 (空の rect で[[MyCustomView alloc] init]呼び出されます) または を使用します。そのフレームを設定し、いくつかのビューに追加します。メソッドは適切なタイミングで呼び出され、それに応じてレイアウトされます。initWithFrame:[[MyCustomView alloc] initWithFrame:...]layoutSubviews

于 2013-08-01T13:08:28.273 に答える
3

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;
}
于 2013-08-01T12:50:46.510 に答える
2

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;
于 2013-08-01T13:08:46.330 に答える
2

これらの行を initWithFrame に配置できます。

self = [super initWithFrame:frame]
if (self!=null) {
// if self has been allocated

UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 40)];
[label setText:@"Label"];
[label setTextAlignment:NSTextAlignmentJustified];
[self addSubview:label];
}

その非常に単純な例.. 1 つのラベルを追加するだけで、プログラムで必要な数のオブジェクトを追加できます.. 目的の場所とフレーム サイズ、および必要なプロパティを使用して...

おそらく、「UILabelをプログラムで検索する必要がありました..

于 2013-08-01T13:05:25.067 に答える