AutoLayout: removeFromSuperview / removeConstraints создает исключение и аварийно завершает работу
мы используем ограничения автоматической компоновки выборочно, в первую очередь для размещения меток по отношению к редактируемым элементам поля (UITextView, UITextField, как правило). Однако с момента реализации автоматического макета для этих полей мы видим неприятное исключение и сбой при выгрузке представлений, освобождении и т. д. Исключения происходят, когда он пытается удалить ограничения из представления перед его выгрузкой.
наша иерархия представления/контроллера выглядит следующим образом такие:
UITableViewController (plain style, but with cell appearance to mimic grouped style)
--> UITableViewCell
----> UIViewController (container for editable form)
------> UICollectionViewController (editable form)
--------> UICollectionViewCell
-----------> UIViewController (editable field)
--------------> UILabel (field label) **HAS CONSTRAINTS**
--------------> UITextView / UITextField (field value) **HAS CONSTRAINTS**
много раз, когда ячейки таблицы верхнего уровня освобождаются/заменяются/перезагружаются, мы видим огромное исключение, а затем сбой, когда он пытается освободить/выгрузить иерархию представления внутри.
Я попытался смягчить сбой, поймав исключение (без помощи) , а также принудительно удалив все ограничения на затронутое представление и все подвиды до освобождения / выгрузки (в viewWillDisappear:) и это, кажется, не помогает. Я даже пробовал чтобы удалить эти ограничения один за другим, чтобы увидеть, если есть один в частности, что вызывает проблемы, но все они взрываются, когда мы называем removeConstraint: или removeConstraints: на контейнере в процессе подготовки к исчезновению.
Я сбит с толку! Вот фрагмент нашего исключения-примерно около 3000 строк были вырезаны из него, так что если вам нужно больше, просто спросите.
Exception while deallocating view: { Rows:
0x18911270.posErrorMarker == 4 + 1*0x18911270.negError + 1*0x189112f0.marker + -1*0x189113f0.negError + 1*0x189113f0.posErrorMarker + 1*0x18911a60.marker + -0.5*0x1892dae0.negError + 0.5*0x1892dae0.posErrorMarker + 1*0x18951520.negError + -1*0x18951520.posErrorMarker + -0.5*0x18958090.negError + 0.5*0x18958090.posErrorMarker
0x189112b0.negError == 12 + 1*0x189112b0.posErrorMarker + -1*0x189112f0.marker + 1*0x189113f0.negError + -1*0x189113f0.posErrorMarker + -1*0x18911a60.marker + 1*0x18925530.marker + 0.5*0x1892dae0.negError + -0.5*0x1892dae0.posErrorMarker + 1*0x1893e080.marker + 0.5*0x18958090.negError + -0.5*0x18958090.posErrorMarker + 1*0x18963640.marker
0x18911370.negError == 9 + -1*0x189112f0.marker + 1*0x18911370.posErrorMarker + 1*0x18925530.marker + 1*0x1892dae0.negError + -1*0x1892dae0.posErrorMarker + 1*0x1893e080.marker + 1*0x18963640.marker
0x189113b0.slackMarker == 2 + -1*0x189107d0.marker + 1*0x18910b90.negError + -1*0x18910b90.posErrorMarker +
........ EXPLETIVES DELETED .........
UITableView:0xca2b000.contentHeight == 36 + 1*0xc221c00.marker
UITableView:0xca2b000.contentWidth == 704 + 1*0xc239470.marker
UITableView:0xca2b000.minX == 0 + 1*0xc2a23f0.marker + -0.5*0xc2a2590.marker
UITableView:0xca2b000.minY == 0 + 1*0xc2a25d0.marker + -0.5*0xc2a2630.marker
UITableViewCellContentView:0x18ab13d0.Height == 174 + 1*0x18abd4f0.marker
UITableViewCellContentView:0x18ab13d0.Width == 704 + 1*0x18abd470.marker
........ EXPLETIVES DELETED .........
<NSAutoresizingMaskLayoutConstraint:0x18988bc0 h=-&- v=-&- UIView:0x18911e50.midY == UIView:0x1892d0c0.midY> Marker:0x18988bc0.marker
<NSAutoresizingMaskLayoutConstraint:0x18994b40 h=-&- v=-&- UIView:0xc4a6fb0.midX == UIView:0xc4b4990.midX> Marker:0x18994b40.marker
<NSAutoresizingMaskLayoutConstraint:0x18998480 h=-&- v=-&- UIView:0x18915180.width == UIView:0xc4c5970.width> Marker:0x18998480.marker
<NSAutoresizingMaskLayoutConstraint:0x18aae320 h=--& v=--& TapSectionalTableViewCell:0x18a3d270.midX == + 352> Marker:0x18aae320.marker
<NSAutoresizingMaskLayoutConstraint:0x18aae410 h=--& v=--& H:[TapSectionalTableViewCell:0x18a3d270(704)]> Marker:0x18aae410.marker
<NSAutoresizingMaskLayoutConstraint:0x18aae450 h=--& v=--& TapSectionalTableViewCell:0x18a3d270.midY == + 144> Marker:0x18aae450.marker
........ EXPLETIVES DELETED .........
<NSAutoresizingMaskLayoutConstraint:0xc2de2f0 h=--& v=--& TapGenericCollectionCell:0xc2ac500.midX == + 499> Marker:0xc2de2f0.marker
<NSAutoresizingMaskLayoutConstraint:0xc2de3b0 h=--& v=--& V:[TapGenericCollectionCell:0xc2ac500(34)]> Marker:0xc2de3b0.marker
<NSAutoresizingMaskLayoutConstraint:0xc2de430 h=-&- v=-&- UIView:0x18953f80.height == UIView:0xc2acb20.height> Marker:0xc2de430.marker
<NSAutoresizingMaskLayoutConstraint:0xc2de520 h=-&- v=-&- UIView:0x18923af0.height == UIView:0xc2ae570.height> Marker:0xc2de520.marker
<NSAutoresizingMaskLayoutConstraint:0xc2de560 h=--& v=--& H:[TapGenericCollectionCell:0xc2ac500(280)]> Marker:0xc2de560.marker
........ EXPLETIVES DELETED .........
<NSContentSizeLayoutConstraint:0xc2f5730 H:[_UIBaselineLayoutStrut:0x18994a30(0)] Hug:250 CompressionResistance:750> Marker:0xc2f5730.posErrorMarker
<NSContentSizeLayoutConstraint:0xc2f5730 H:[_UIBaselineLayoutStrut:0x18994a30(0)] Hug:250 CompressionResistance:750> Marker:0xc2f5730.posErrorMarker
<NSContentSizeLayoutConstraint:0xc2f5770 V:[_UIBaselineLayoutStrut:0x18994a30(18)] Hug:250 CompressionResistance:750> Marker:0xc2f5770.posErrorMarker
internal error. Cannot find an outgoing row head for incoming head UIView:0x189712b0.Width, which should never happen.'
/**** BEGIN Individual Field Controller - This code is from the base individual field controller used in our editable form collection *****/
- (void)viewDidLoad {
[super viewDidLoad];
self.view.clipsToBounds = YES;
self.view.opaque = YES;
CGRect viewFrame = self.view.frame;
viewFrame.size = [self defaultFieldSize];
self.view.frame = viewFrame;
if (self.backgroundColor) {
self.view.backgroundColor = self.backgroundColor;
}
else {
self.view.backgroundColor = [UIColor whiteColor];
}
[self createLabelAndField];
[self setLabelAndFieldContraints];
[self.view addConstraints:self.labelValueConstraints];
[self.view setNeedsUpdateConstraints];
}
- (void)createLabelAndField {
[self removeLabelAndField];
UILabel *label = [[UILabel alloc] init];
label.font = self.labelFont;
label.textColor = self.labelColor;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.textAlignment = NSTextAlignmentLeft;
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;
if (self.backgroundColor) {
label.backgroundColor = self.backgroundColor;
}
else {
label.backgroundColor = [UIColor whiteColor];
}
[self.view addSubview:label];
self.label = label;
/// EXAMPLE valueView initialization from a subclass that handles long text
TapEditableTextView *textView = [[TapEditableTextView alloc] init];
if (self.hasLabelOverValue) {
textView.shouldMimicTextField = NO;
}
else {
textView.shouldMimicTextField = YES;
}
textView.delegate = self;
textView.keyboardType = UIKeyboardTypeDefault;
textView.font = self.valueFont;
textView.textColor = self.valueColor;
textView.textAlignment = NSTextAlignmentLeft;
textView.normalBackgroundColor = self.backgroundColor;
textView.editable = NO;
textView.textLines = self.textLines;
self.valueTextView = textView;
self.valueView = textView;
[self.view addSubview:textView];
}
- (void)removeLabelAndField {
[self clearConstraints];
if (self.label) {
[self.label removeFromSuperview];
self.label = nil;
}
if (self.valueView) {
[self.valueView removeFromSuperview];
self.valueView = nil;
}
}
- (void)clearConstraints {
if (self.isViewLoaded && self.labelValueConstraints) {
[self.view removeConstraints:self.labelValueConstraints];
}
self.labelValueConstraints = nil;
self.labelToValueHorizConstraint = nil;
self.valueWidthConstraint = nil;
}
// This is called in our field's viewDidLoad, after we've created our label and valueView (UITextField, UITextView, etc)
- (void)setLabelAndFieldContraints {
[self clearConstraints];
self.labelValueConstraints = [NSMutableArray array];
self.label.translatesAutoresizingMaskIntoConstraints = NO;
self.valueView.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *constraint = nil;
constraint = [NSLayoutConstraint
constraintWithItem:self.label attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeLeft
multiplier:1.0f constant:self.labelValueGap];
constraint.priority = UILayoutPriorityRequired;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.label attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeTop
multiplier:1.0f constant:0];
constraint.priority = 550;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.label attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeBottom
multiplier:1.0f constant:0];
constraint.priority = 400;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.valueView attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeTop
multiplier:1.0f constant:0];
constraint.priority = UILayoutPriorityRequired;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.valueView attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeBottom
multiplier:1.0f constant:0];
constraint.priority = 499;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.valueView attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeRight
multiplier:1.0f constant: -(kDisclosureWidth + self.labelValueGap) ];
constraint.priority = 901;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.valueView attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:self.label attribute:NSLayoutAttributeTrailing
multiplier:1.0f constant:self.labelValueGap];
constraint.priority = UILayoutPriorityDefaultHigh + 1;
[self.labelValueConstraints addObject:constraint];
self.labelToValueHorizConstraint = constraint;
constraint = [NSLayoutConstraint
constraintWithItem:self.label attribute:NSLayoutAttributeBaseline
relatedBy:NSLayoutRelationEqual
toItem:self.valueView attribute:NSLayoutAttributeBaseline
multiplier:1.0f constant:0.f];
constraint.priority = 600;
[self.labelValueConstraints addObject:constraint];
constraint = [NSLayoutConstraint
constraintWithItem:self.valueView attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeWidth
multiplier:(1.f - self.labelWidthPercentage) constant:0];
constraint.priority = 305;
[self.labelValueConstraints addObject:constraint];
self.valueWidthConstraint = constraint;
[self setCompressionAndHuggingForLabelView:self.label];
[self setCompressionAndHuggingForValueView:self.valueView];
}
- (void)setCompressionAndHuggingForLabelView:(UILabel *)labelView {
if (!labelView) {
return;
}
[labelView setContentCompressionResistancePriority:510 forAxis:UILayoutConstraintAxisHorizontal];
[labelView setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
[labelView setContentHuggingPriority:450 forAxis:UILayoutConstraintAxisHorizontal];
[labelView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
}
- (void)setCompressionAndHuggingForValueView:(UIView *)valueView {
if (!valueView) {
return;
}
[valueView setContentCompressionResistancePriority:509 forAxis:UILayoutConstraintAxisHorizontal];
[valueView setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
[valueView setContentHuggingPriority:300 forAxis:UILayoutConstraintAxisHorizontal];
[valueView setContentHuggingPriority:650 forAxis:UILayoutConstraintAxisVertical];
}
/****** END Individual Field Controller ******/
13 ответов:
у меня был (обширный) разговор с инженером Apple об этой аварии.
вот две наиболее вероятные причины:
у вас есть недопустимое ограничение, например
view1.left = view2.left + 20здесьview2неожиданно равен нулю или имеет множитель 0. Обязательно дважды (и трижды) проверьте свои ограничения, чтобы убедиться, что они верны. Вот 2 примера проблемных ограничений:// The first constraint would be a problem if view2 were nil [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeBottom multiplier:1 constant:20]; // The second constraint is a problem because the 0 multiplier causes view2 to be "lost" [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeBottom multiplier:0 constant:5];вы попали ошибка в двигатель внутреннего плана учредительства автоматический отнесенный к аккумулированной потере точности с плавающей запятой. Когда вы разбились, вы можете узнать, что это так, чтобы искать через (Большой) Журнал исключений в консоли для очень маленького (почти нулевого) числа с плавающей запятой, такого как это:
<505:-7.45058e-08>*PWPlotLegendEntryView:0x600000582be0.Height{id: 34609} +(ищите
e-в выводе консоли, чтобы найти небольшие числа, как это.) Это число (-7.45058e-08в этом случае) представляет коэффициент при это конкретный момент времени, когда внутренний двигатель решает ограничения. В этом случае число должно быть ровно 0, но из-за того, как механизм автоматической компоновки выполняет вычисления с числами с плавающей запятой, он стал чрезвычайно крошечным отрицательным числом, вместо которого все взрывается. Если вы можете найти такое число в выходных данных, вы знаете, что вы попали в эту ошибку.как вы можете обойти эту проблему?
изменение порядка добавления (активировать) ограничения могут в конечном итоге изменить порядок вычислений во внутреннем движке, что в результате может привести к тому, что эта проблема исчезнет, поскольку математика выполняется без какой-либо проблемной потери точности.
эта проблема, похоже, возникает чаще, когда вы изменили сопротивление сжатию контента или приоритеты обнимания контента для представлений, поэтому попробуйте закомментировать любой код, который это делает, чтобы увидеть, вызывает ли это эту ошибку, или переупорядочить ее раньше или позже позже в коде настройки ограничения.
подробнее о моем конкретном случае:
я столкнулся с этим сбоем на iOS. Шаги по его воспроизведению были довольно интересными:
- на экран был выведен контроллер вида, содержащий табличный вид (в навигационном контроллере).
- табличное представление должно было содержать достаточно ячеек, чтобы они не помещались в видимой области, затем его нужно было прокрутить до последней ячейки, а затем создать резервную копию бит (предположительно, это вызывало повторное использование ячеек, что вызывало эту проблему).
- затем, когда контроллер вида, содержащий табличное представление, был удален из стека навигации, сразу же после завершения анимации pop приложение завершит работу в точке, где представление контроллера вида было удалено из иерархии представлений.
после многих проб и ошибок я смог изолировать проблему до одной конкретной вещи: установка Сжатия контента сопротивление и обнимать приоритеты для
UIImageViewв каждой из ячеек табличного представления. В этом случае представление изображения позиционируется с использованием автоматической компоновки внутри ячейки, и для достижения правильной компоновки представление изображения должно быть точно его внутренним размером содержимого (размером его изображения).это был проблемный код:
// Inside of the UITableViewCell's updateConstraints method... [self.imageView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; [self.imageView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; [self.imageView setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; [self.imageView setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];удаление вышеприведенного кода и замена его на 2 ограничения (при необходимом приоритете) для фиксации ширины и высоты изображения на экране размер изображения достиг того же результата, но избежал аварии. Вот код замены (с помощью PureLayout):
[self.imageView autoSetDimensionsToSize:self.imageView.image.size];Я также обнаружил, что просто перемещение проблемных 4 строк в другое место в моем коде настройки ограничений решило проблему, предположительно потому, что это изменило порядок вычислений достаточно, чтобы предотвратить проблемную потерю точности.
проблема освобождения-одна возможность
ваш код, который работает с автоматической компоновкой, может хорошо работать в основном потоке, но один из блоков, который работает в фоновом режиме и использует ваше представление (возможно, косвенно), может содержать сильную ссылку на представление или один из его владельцев, таких как контроллер представления (это поведение по умолчанию для блоков Objective-C). Когда такой блок запускается и освобождается в фоновой очереди, сильные ссылки, которые он захватывает, освобождаются в той же очереди, и вы может столкнуться с хорошо известным проблема освобождения.
в контроллере вида убедитесь, что вы используете слабую ссылку на
selfво всех блоках, что не нужно сильная ссылка (и может работать в фоновом режиме). Вы можете объявить это так:__weak typeof(self) weakSelf = self;перед блоком - и использоватьweakSelfвнутри блока.то же самое касается любых локальных переменных, которые содержат ссылки на ваши представления - убедитесь, что их значения захватили как слабые ссылки.
еще одна возможность
в моей работе я столкнулся с подобной проблемой на iOS 6 когда скрытый вид участвовал в макете. Удаление представления из иерархии (
-[UIView removeFromSuperview]) вместоhiddenсвойство "да", Исправлена проблема для меня.
имел ту же проблему, решил ее, удалив ограничения по одному в IB до тех пор, пока сбой не был решен. Это сузило его до оскорбительного ограничения. Затем я восстановил указанное ограничение, но изменил пункты:
вы можете быть так же повезло и быть в состоянии решить ваши проблемы AL, как легко.
для тех, кто сталкивается с этой проблемой в любой версии iOS > 8.0, состояние документов Apple использует свойство "active" на NSLayoutConstraint, а не функции removeConstraint/addConstraint в UIView. Apple Docs addConstraint reference
чтобы сделать удивительный ответ @smileyborg более действенным:
Это может произойти, если у вас есть какие-либо ограничения с множителями, которые могут страдать от проблем точности с плавающей запятой.
решение:
- перейдите по всем вашим ограничениям, которые имеют множители (в коде макета или вручную редактируя раскадровку / перо и ища
multiplier=).- если множитель не является "красивой" силой двух поплавков, поверните его к ближайшему (вы можете использовать калькулятор с плавающей запятой)
чтобы легко сделать 2, введите число, которое вы хотите, и калькулятор, а затем отключите более низкие биты точности в мантиссе, пока значение не совпадет с округленным десятичным значением в нижней части калькулятора.
в моем случае это было пропорциональное ограничение ширины с множителем 8:9. Я изменил его на 7:9 и все работало.
кстати самый простой способ найти ограничение-начать удаление представлений из контроллера вида. Сделать это с помощью двоичного алгоритма :) убрав половину представления, потом половину половины, что делает приложение аварии, и т. д.
для меня проблема заключалась в том, что я удалял ограничение в то время, которое меня устраивало, после вызова dequeueReusableCellWithReuseIdentifier при установке свойств моего UICollectionViewCell. Решение было вместо этого позвонить:
[_myUICollectionViewCell setNeedsUpdateConstraints];и переопределить:
-(void)updateConstraintsи у меня балуется. Кажется, что вы не можете просто удалить ограничения, когда вам нравится.
Я просто наткнулся на ту же ошибку в OSX Mavericks с приложением OSX, которое я разрабатываю, но в отличие от других ответов, у меня определенно нет других потоков, взаимодействующих с объектами пользовательского интерфейса, и иерархия представлений, о которой идет речь, определенно видна. Я тоже не использую блоки. Как ни странно, проблема ушла, когда я удалил вертикальное ограничение на NSTextField.
fwiw проблемное представление, удаление которого из его супервизора вызывает "внутреннюю ошибку. Ошибка "не удается найти исходящую головку строки для входящей головки" является одним из многих элементов управления боковой панели, которые вместе представляют свойства объектов в главном виде, которые могут быть вырезаны, скопированы, созданы и т. д. Это означает, что пользователь может вставлять новые объекты в основной вид довольно быстро, что означает, что элементы управления боковой панели уничтожаются и новые создаются очень быстро. Конечно, со всем в основном потоке, это не должно иметь значения, но это кажется.
в точное ограничение, вызывающее проблемы, было
[self addConstraint: [NSLayoutConstraint constraintWithItem: управление атрибут: NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:другие атрибут: NSLayoutAttributeHeight коэффициент:1.4 константа:0.0]];
где control-это (редактируемое) nstextfield, вызывающее проблемы, а "другое" - это другая (не редактируемая) метка NSTextField.
у меня эта проблема с
MZFormSheetControllerpod:https://github.com/m1entus/MZFormSheetController/issues/78этот код аварийно завершает работу:
[formSheetController.view addSubview:self.sharePanel]; // ... [self.sharePanel removeFromSuperview]; // <-- CRASHES HEREмое решение очень странно, но оно работает:
[self.sharePanel removeFromSuperview]; // <-- This line helps to avoid crash [formSheetController.view addSubview:self.sharePanel]; // ... [self.sharePanel removeFromSuperview];и вот это
sharePanelобъявление:@property (weak, nonatomic) IBOutlet UIView *sharePanel;
Я получил этот сбой, когда у меня все еще есть недостающее ограничение в режиме wAnyhAny, исправляя это, удалил ошибку.
поскольку другие ответы в этом потоке указывают, что это как-то недопустимая проблема autolayout/contraint, хотя она кажется очень привередливой в отношении того, что квалифицируется как "недопустимое".
к счастью, я не сделал много изменений с момента моего последнего коммита и смог отслеживания изменений. Для меня имея вид 10 горизонтальных
UIImageViewс равной шириной и фиксированным соотношением сторон 2:3 была проблема.авария, казалось, произошла только после выхода из
UIViewControllerчто содержит эту строку изображения. КаждыйUIImageViewбыл установлен доUIViewContentModeScaleAspectFill. Удаление этого изменения режима содержимого (которое было сделано доUIImages были установлены), казалось, исправить мою проблему, но не было приемлемым решением. Я закончил тем, что удалил ограничение соотношения сторон и просто использовал фиксированную ширину и высоту для каждого изображения.почему это был сбой моего приложения, я не знаю... Авария также может только воспроизводиться на iPhone 4s под управлением iOS 7.1.2. Я пытался воспроизвести то же самое сбой на симуляторе iPhone 4s под управлением iOS 9.1 без успеха. Он также не будет сбой при работе на phsyical iPhone 5 под управлением iOS 9.1.
надеюсь, что это поможет кому-то там
согласно документации Apple:
при разработке для iOS 8.0 или более поздней версии, установить ограничения,активный свойство да вместо вызова метода addConstraint: напрямую. Свойство active автоматически добавляет и удаляет ограничение из правильного представления.
в моем случае мне пришлось изменить ограничение ширины
for var constraint in self.navigationBar.constraints { if constraint.identifier == "theProgressWidth" { let sizeWidth = self.navigationBar.frame.size.width constraint = NSLayoutConstraint(item: progress!, attribute: .Width, relatedBy: .Equal, toItem: self.navigationBar, attribute: .Width, multiplier: ((sizeWidth * (level / 100)) / sizeWidth), constant: 0) constraint.active = true } }

Comments