Программное создание UIView с несколькими метками

StackOverflow https://stackoverflow.com//questions/21000392

  •  20-12-2019
  •  | 
  •  

Вопрос

Проблема со конструктором интерфейса Xcode
Лично мне не нравится, как в Xcode работает построитель интерфейсов.В этом примере я пытаюсь создать довольно сложный контроллер представления.На viewDidLoad контроллера представления я показываю собственное представление оповещений (как таковое).На самом деле это не представление предупреждений, а скорее представление, которое показывает пользователю некоторую информацию.У меня есть затемненный фоновый вид и вид поверх него.Если я попытаюсь создать это в конструкторе интерфейсов, это станет слишком сложным, поскольку вы не сможете выбирать представления в фоновом режиме, перемещать их и т. д., не помещая подпредставления в неправильные представления и т. д....

Сценарий
Я пытаюсь создать представление, содержащее несколько меток и кнопку.У контроллера представления есть свойство сложности, поэтому в метках/количестве меток будет другой текст.
Т.е.Легко – 3 этикетки
Жесткий — 4 этикетки

Я создаю dimmedView и alert(styled)View следующим образом:

// 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];

Затем я создаю три/четыре метки на основе некоторой логики и добавляю необходимые метки к startingAlertView также основано на логике.

Очевидная проблема заключается в том, что ни в каком месте не устанавливается рамка для представления.Это означает, что он возвращает 0,0,0,0.Я хотел бы, чтобы представление принимало необходимую высоту в зависимости от добавленных меток.

Я создаю IOS7 и использую Auto Layout.Должен ли я устанавливать ограничения, которые затем, возможно, будут корректировать соответствующие высоты и местоположения на виде?

Это было полезно?

Решение

Я создаю IOS7 и использую Auto Layout.Должен ли я устанавливать ограничения, которые затем, возможно, будут корректировать соответствующие высоты и местоположения на виде?

Да.ты не используешь initWithFrame: при авторазметке, точнее, можно, но фрейм игнорируется.Создайте свой вид затемнения с помощью рамки CGRectZero, параметр translatesAutoresizingMasksToConstraints выберите НЕТ, добавьте его в основной вид и создайте ограничения, прикрепляющие его ко всем краям суперпредставления.

Затем добавьте представление оповещений, снова с нулевой рамкой и translates... свойство установлено в НЕТ.Создайте ограничения, чтобы центрировать это представление в представлении затемнения.Размер этого представления будет зависеть от его подпредставлений, поскольку метки имеют внутренний размер.

Добавьте свои метки в качестве подвидов этого представления с нулевой рамкой и translates... установите НЕТ.В зависимости от их содержимого вы можете установить предпочтительную максимальную ширину макета или ограничение ширины.

Создайте ограничения, прикрепляющие ваши метки к левому и правому краям суперпредставления, и выстраивайте метки в вертикальную «стопку».В каждом случае вы можете добавить отступы, чтобы придать вашему предупреждению некоторую границу.

Это может выглядеть как большой объем кода, поэтому вы можете прочитать статьи, которые я написал. визуальный формат для автоматической компоновки и создание ограничений в коде, с соответствующим категория удобства авторазметки чтобы сделать вашу жизнь проще.

Другие советы

Если вы идете на маршрут AUTO MALEOUT, вы можете добавить ограничения, которые будут поддерживать правильное пространство между каждой этикеткой, а также надлежащим пространством между верхней и нижней частью вида с первыми и последними метками.Однако, если вы не делаете это в Interface Builder, вы можете также пропустить с помощью автоматической макета также, потому что он довольно просто просто отрегулировать высоту представления, когда вы добавляете этикетки.

Вы начнете, установив высоту представления на размер верхних и нижних пробелов, которые вы хотите иметь вокруг этикеток.Затем каждый раз, когда вы добавляете метку, добавьте к нему высоту этикетки плюс высота пространства, которую вы надеваете между этикетками.

Вы также можете подождать, пока вы не добавите все этикетки, которые вы хотите, то установите высоту в положение нижней этикетки Y плюс его высота плюс нижнее пространство, которое вы хотите иметь вокруг меток.

Да, используя Autolayout Вы можете получить границы от родительского представления.

Вот быстрый пример, обратите внимание, что мы не используем кадр, а используя CGrectzero для наших UILabels, вместо этого позиционирование происходит от 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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top