Как установить рамку подпредставления как рамку его родителя в пользовательском представлении
Я хочу установить рамку пользовательского представления в качестве рамки моего подпредставления, которая является UILabel. но когда я использую self.frame UILabel
показывает пустой текст. Мне нужно жестко закодировать параметры в CGRectMake
чтобы увидеть мой UILabel
, Как установить рамку UILabel в качестве рамки моего пользовательского представления?
- (id)initWithFrame:(CGRect)frame withText:(NSString *)text
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor grayColor];
self.layer.cornerRadius = 3;
self.layer.borderWidth = 1;
self.layer.borderColor = [UIColor blackColor].CGColor;
_text = text;
}
return self;
}
- (void)layoutSubviews
{
// This works
// UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 40)];
// This doesn't work
UILabel *label = [[UILabel alloc] initWithFrame:self.frame];
label.text = @"";
if (![self.text isEqualToString:@"?"]) {
label.text = self.text;
label.textAlignment = NSTextAlignmentCenter;
}
[self addSubview:label];
}
4 ответа
layoutSubviews
будет вызываться много раз, поэтому вы не должны addSubview
как это. Лучший стиль - установить свойство UILabel, например, text
имущество:
@property (nonatomic, strong) UILabel * label;
затем измените свой layoutSubviews
код:
- (void)layoutSubviews
{
if(!self.label){
self.label = [[UILabel alloc] initWithFrame:self.frame]; //Use ARC
self.label.textAlignment = NSTextAlignmentCenter;
[self addSubview:self.label];
}
self.label.frame = self.bounds;
if (![self.text isEqualToString:@"?"]) {
self.label.text = self.text;
}
}
Попробуйте с помощью следующего кода.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 70, 40)]; // set frame as you want
label.backgroundColor = [UIColor yellowColor]; // set color as you want
label.text = @"Hellow";
[yourParentView addSubview:label];
Вы не хотите создавать представления внутри layoutSubviews
метод. Этот метод может быть вызван несколько раз, и вы будете создавать каждое представление несколько раз (с перекрытием друг друга).
Вместо этого создайте нужные вам представления в initWithFrame
метод.
Для ответа на ваш реальный вопрос вам, вероятно, нужно установить рамку новой метки в границах пользовательского представления. Границы будут иметь происхождение 0,0, поэтому они не будут работать, если пользовательский вид помещен в его суперпредставление. Если вы используете рамку, метка будет смещена, насколько смещено пользовательское представление.
Вы можете, вероятно, полностью удалить свой layoutSubviews
метод, поскольку это не место для установки текста метки. Затем добавьте это:
- (instancetype)initWithFrame:(CGRect)frame withText:(NSString *)text
{
self = [super initWithFrame:frame];
if (!self) return nil;
self.backgroundColor = [UIColor grayColor];
self.layer.cornerRadius = 3;
self.layer.borderWidth = 1;
self.layer.borderColor = [UIColor blackColor].CGColor;
_text = text;
UILabel *label = [[UILabel alloc] initWithFrame:self.bounds];
label.text = @"";
if (![self.text isEqualToString:@"?"]) {
label.text = self.text;
label.textAlignment = NSTextAlignmentCenter;
}
[self addSubview:label];
return self;
}
Если вы хотите, чтобы размер метки изменялся при изменении размера пользовательского представления, вы можете сделать это в layoutSubviews, установив label.frame = self.bounds;
, но вам лучше использовать маски с автоматическим изменением размера или автоматическое расположение.
Используйте этот код
- (id)initWithFrame:(CGRect)frame withText:(NSString *)text
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor grayColor];
self.layer.cornerRadius = 3;
self.layer.borderWidth = 1;
self.layer.borderColor = [UIColor blackColor].CGColor;
_text = text;
[self layoutSubviews:frame];
}
return self;
}
- (void)layoutSubviews:(CGRect)myFrame
{
// This works
// UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 40)];
// This doesn't work
UILabel *label = [[UILabel alloc] initWithFrame:myFrame];
label.text = @"";
if (![self.text isEqualToString:@"?"]) {
label.text = self.text;
label.textAlignment = NSTextAlignmentCenter;
}
[self addSubview:label];
}