プログラムで複数のラベルを持つUIViewを作成します
-
20-12-2019 - |
質問
xcodeインターフェースビルダー問題
個人的には、Interface BuilderがXcodeで機能する方法は好きではありません。この例では、かなり複雑なビューコントローラを作成しようとしています。 View ControllerのviewDidLoad
では、カスタムアラートビューを表示します(そのように)。それは実際には警告ビューではなく、ユーザーにいくつかの情報を表示するビューの詳細です。私は淡色の背景ビューとこの上のビューを持っています。 Interface Builderでこれを作成しようとすると、バックグラウンドでビューを選択して、サブビューを間違ったビューやその他のビューにドロップすることなく、その他のビューを移動することはできません。
シナリオ
私がやろうとしていることは、いくつかのラベルとボタンを保持するビューを作成することです。 View Controllerはこれに基づいて財産が困難です。ラベル/ラベルの量に異なるテキストがあります。
即ちイージー - 3ラベル
ハード - 4ラベル
このような薄暗い視聴(スタイル付き)ビューを作成します。
// Setup the dimmedView
UIView *dimmedView = [[UIView alloc] initWithFrame:self.view.frame];
dimmedView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];
// Setup the startingAlertView
UIView *startingAlertView = [[UIView alloc] init];
startingAlertView.backgroundColor = [UIColor whiteColor];
.
次に、いくつかの論理に基づいて3つのラベルを作成し、論理に基づいてNecassaryラベルをstartingAlertView
に追加します。
明らかな問題は、ビューのフレームが設定されていないことです。これは、0,0,0,0を返していることを意味します。私が起こったことは、追加されたラベルに基づいて必要な高さを取ります。
iOS7のための建物、そして自動レイアウトを使用しています。私はおそらくビュー内の関連する高さと場所を調整する制約を設定する必要がありますか?
解決
iOS7のための建物、そして自動レイアウトを使用しています。私はおそらくビュー内の関連する高さと場所を調整する制約を設定する必要がありますか?
はい。自動レイアウトの下にinitWithFrame:
を使用しない場合、またはむしろ、フレームは無視されます。 CGRectZero
のフレームで調光ビューを作成し、translatesAutoresizingMasksToConstraints
をNoに設定し、メインビューに追加し、それをSuperViewのすべてのエッジに固定する制約を作成します。
次に、ゼロのフレームとtranslates...
プロパティをゼロに設定し、Noに設定します。このビューを調光ビューで中心にする制約を作成します。このビューは、ラベルに固有のサイズがあるため、そのサブビューからそのサイズが表示されます。
このビューのサブビューとしてラベルを追加し、ゼロのフレームとtranslates...
をNoに設定します。コンテンツに応じて、優先最大レイアウト幅または幅制約を設定することをお勧めします。
制約を作成するスーパービューの左右の端にラベルを固定し、ラベルを垂直の 'スタックに上げて上にします。いずれの場合も、警告を境界の少し警戒させるためにパディングを追加することができます。
これは大量のコードのように見えるので、私が書いた記事を読むことができます自動レイアウトと CODE の制約を作成するあなたの人生をより簡単にするために、AutoLayoutの便利なカテゴリー。
他のヒント
自動レイアウトルートに進んでいる場合は、各ラベルの間に適切なスペースと、ビューの上下の間の適切なスペースと、最後のラベルと最後のラベルを追加できます。ただし、これをInterface Builderで実行していない場合は、ラベルを追加するだけでビューの高さを調整するだけでよく簡単なので、自動レイアウトを使用してスキップすることもできます。
ビューの高さをラベルの周囲に持つ上部と下のスペースのサイズに設定します。次に、ラベルを追加するたびに、ラベルの高さとラベルの間に置かれているスペースの高さを追加します。
あなたが望むすべてのラベルを追加するまで待つこともできますから、下のラベルのy位置に、その高さとラベルの周囲に持ちたい底のスペースに高さを設定することもできます。
はい、AutoLayoutを使用して、親ビューから境界を取得できます。
これは簡単な例です。フレームを使用していないこと、およびUILabelsのCgrectZeroを使用していることに注意してください.POISTINGは代わりにupdateConstraints
から来ています。私はビジュアルフォーマット言語あなたがそれをプログラムでやっているなら私が推薦するラベルをレイアウトします。
ここでは、親ビューの幅をラベルにしてから、互いの上に積み重ねたばかりです。
#import "View.h"
@implementation View{
UILabel *_label1;
UILabel *_label2;
UILabel *_label3;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_label1 = [[UILabel alloc] initWithFrame:CGRectZero];
_label1.translatesAutoresizingMaskIntoConstraints = NO;
_label1.text = @"LABEL 1";
_label2 = [[UILabel alloc] initWithFrame:CGRectZero];
_label2.translatesAutoresizingMaskIntoConstraints = NO;
_label2.text = @"LABEL 2";
_label3 = [[UILabel alloc] initWithFrame:CGRectZero];
_label3.translatesAutoresizingMaskIntoConstraints = NO;
_label3.text = @"LABEL 3";
[self addSubview:_label1];
[self addSubview:_label2];
[self addSubview:_label3];
}
[self updateConstraintsIfNeeded];
return self;
}
-(void)updateConstraints
{
[super updateConstraints];
NSDictionary *_viewsDictionary = NSDictionaryOfVariableBindings(_label1,_label2,_label3);
// Set the contraintsto span the entire width of the super view
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|"
options:0
metrics:nil
views:_viewsDictionary];
[self addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label2]-|"
options:0
metrics:nil
views:_viewsDictionary];
[self addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label3]-|"
options:0
metrics:nil
views:_viewsDictionary];
[self addConstraints:constraints];
// Last setup the vertical contraints other wise they will end up in a random place
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label1]-[_label2]-[_label3]"
options:0
metrics:nil
views:_viewsDictionary];
[self addConstraints:constraints];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
.