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