Как установить рамку подпредставления как рамку его родителя в пользовательском представлении

Я хочу установить рамку пользовательского представления в качестве рамки моего подпредставления, которая является 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];
}
Другие вопросы по тегам