Apple, допили пожалуйста Interface Builder!

в 14:02, , рубрики: apple, iOS, ipad, iphone, storyboard, разработка под iOS, метки: , , , ,

Этот пост — крик гнева в сторону Apple, и все же во мне осталась надежда. Я являюсь iOS-разработчиком уже 4 года, и то, что поначалу казалось сиюминутным несовершенством, несущественными деталями, с годами превращается в китайскую пытку водой, а ведь мы с вами пользуемся IB каждый день, ну или хотя бы раз в неделю.

Apple, допили пожалуйста Interface Builder!

Возможно, Apple и не заслуживает такой критики — правда, все остальное, ну или почти все остальное, у них на высоте. Исключая iTunes и Apple developer portal (который за последние годы, все же, стал значительно лучше) технологии позволяют сосредоточиться на том, что ты делаешь, а не на том, как это будет смотреться в IE.

Сначала я не использовал IB вовсе, уж таким кривым и убогим он мне казался после других визуальных редакторов. Даже Macromedia Dreamviewer MX, имхо, имел больше шансов называться WYSIWYG-редакторов для UI. Но прошло несколько лет, и появилась замечательная штука — Autolayout — которую катастрофически неудобно имплементить в коде. Мало счастья в таком коде:

UIImageView *iv = [[UIImageView alloc] initWithImage:image];
    UIView *renderView = [[UIView alloc] initWithFrame:iv.bounds];
    NSInteger completedDistance = renderView.bounds.size.width * percentsCompleted;
    UIView *progressView = [[UIView alloc] initWithFrame:CGRectMake(completedDistance, 0, renderView.bounds.size.width, renderView.bounds.size.height)];
    progressView.backgroundColor = RGB_UICOLOR(255, 255, 255, 0.8);
    renderView.clipsToBounds = YES;
    [renderView addSubview:iv];
    [renderView addSubview:progressView];

но код вида

NSMutableArray *constraints = [@[] mutableCopy];
    
    [constraints addObject:[NSLayoutConstraint constraintWithItem:self
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.parentView
                                  attribute:NSLayoutAttributeWidth
                                 multiplier:1
                                   constant:0]];
   [constraints addObject:[NSLayoutConstraint constraintWithItem:self
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.parentView
                                  attribute:NSLayoutAttributeHeight
                                 multiplier:1
                                   constant:0]];
    [constraints addObject:[NSLayoutConstraint constraintWithItem:self
                                  attribute:NSLayoutAttributeTop
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.parentView
                                  attribute:NSLayoutAttributeTop
                                 multiplier:1
                                   constant:0]];
    [constraints addObject:[NSLayoutConstraint constraintWithItem:self
                                 attribute:NSLayoutAttributeLeading
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.parentView
                                 attribute:NSLayoutAttributeLeading
                                multiplier:1
                                  constant:0]];
    
    [self.parentView addConstraints:constraints];

ввергает душу девелопера в уныние и депрессию. В IB настройка авторазметки (autolayout) по началу тоже на сахар, но с ходом времени приноравливаешься, начинаешь заставлять себя не замечать жутких косяков, терпеть маленькие недостатки пока… у тебя не случается истерика и количество откровенных ляпов, неисправленных годами, не переваливает за все разумные пределы. А ведь альтернативы нет, формат недокументарованный, сторонних инструментов не будет! Вот мой укороченный черненький списочек:

  • дайте масштаб хотя бы 200%! Если на вьюхе много маленьких элементов, можно сойти с ума тыкая мышкой в микроскопические вьюшечки, выбирать из длиннющего списка — тоже задача не из быстроприятных;
  • визуально можно задать далеко не все свойства вьюх, хорошо если 30%. Вспоминается Borland Delphi и его волшебный Object Inspector, в котором можно было создать практически любую вьюху, и выглядела она почти так же, как и в рантайме. В IB вьюхи похожи на говно, точнее на набор абстрактных квадратов руки Пикассо. Зато есть флаг Hidden (ВСЕ, ВСЕ выставляют его программно в зависимости от событий!) и Stretching (я даже не знаю, что это такое);
  • Раньше в качестве хедера таблицы катила вьюха (UIView), сейчас нужен UITableViewHeaderFooterView. Окей, откуда же мне ее перетащить в ксиб? Правильно, ниоткуда, пиши руками! А если вздумаешь подсунуть таблице UIView-ху, я обижусь и крэшнусь;
  • Нет внятного XML, который генерит IB. Вручную невозможно ни подправить, ни смержить. Начинаешь, прости господи, завидовать Android-разработчикам — у них есть в меру говеный визуальный редактор, но в случае чего пишите ручками — никто не обидится!
  • После смены класса вьюхи ее «IB-сверхъя» не меняется, что ведет к глюкам и крашам как вашего приложения, так и всего xCode. Допустим, вы полчаса создавали UITableViewCell со множеством сабвьюшек и констрэйнтов, и вдруг внезапно поняли, что вам нужен CollectionView и, соответственно, его ячейка. Выход один — пока вы не потратили невосполнимый запас жизненной энергии, удаляйте ксиб и пересоздавайте его с нуля. Только так Apple может гарантировать вам работоспособность приложения;
  • Где внятные best practices по сторибордам, особенно если приложение не блокнот или калькулятор? Когда пытаешься портануть на айпад приложение, которое индус или соотечественник, увлеченный индийской культурой разрабатывал исключительно в сториборде, плачешь кровавыми слезами. Ячейки таблиц нужно вооще запретить создавать в сторибордах, ксибы и только ксибы! Система должна иметь минимальную защиту от дурака;

Мало всего этого, нам недавно добавили новой боли в заднице:

  • Наиглючнейший интерфейс IB (простите тафтологию) из всех предыдущих реинкарнаций! Констрэйнты часто притворяются Leading space (видимо, такая рыба в собственном ксибе). Единственный способ понять, что это такое — чуть-чуть раздвинуть окно Assistant Editor-а, но!
  • При этом наш холст начинает плавно уезжать вверх и влево!
  • За год, прошедший с выхода iOS 6 все уже привыкли, что IB сам доставляет все ненужные констрэйнты до логической целостности, а тут он по умолчанию делает это неявно, во время компиляции ксиба! Так что предугадать, к чему приведет введение одного лишь width, без запуска приложения никак нельзя. Советую использовать команду «Add missing constraints» и верстать по-старинке.

К чести Apple можно сказать, что констрэйнты перестали съезжать от каждого чиха на мышку, а ведь это доводило меня до нервного срыва 4 раза в xCode 4, а напарник друга коллеги даже скончался от сердечного приступа.

Те, кто недавно открыл для себя iOS, хором поют «допилят!», свято веруя в икону яблока и Стива Джобса. На что я возражаю: «Не допилят!», у них всегда найдется десяток дел поважнее. Действительно важных, красивых дел, но Apple — мы имеем с IB дело каждый день, пожалей нас, простых смертных девелоперов!

На прощание хочу предложить интересный опрос:

Автор: iago

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js