自动布局:removeFromSuperview / removeConstraints引发异常并严重崩溃

2020/12/02 23:43 · ios ·  · 0评论

我们选择性地使用自动布局约束,主要是相对于可编辑字段元素(通常是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 ******/

我与苹果工程师进行了一次(广泛的)对话,以讨论这次崩溃。

这是两个最可能的原因:

  1. 您有一个无效的约束,例如view1.left = view2.left + 20whereview2意外为nil或乘数为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];
    
  2. 您遇到的是内部Foundation自动布局引擎中的一个错误,该错误与浮点精度的累积损失有关。当您崩溃时,可以知道是这种情况的方法是在控制台中的(大)异常日志中搜索非常小的(几乎为零)浮点数,例如:

<505:-7.45058e-08>*PWPlotLegendEntryView:0x600000582be0.Height{id: 34609} +

e-在控制台输出中搜索以找到这样的小数字。)此数字(-7.45058e-08在这种情况下)表示内部引擎解决约束时在特定时间点的系数。在这种情况下,该数字应该正好为0,但是由于自动布局引擎使用浮点数进行计算的方式,它已成为一个非常小的负数,反而会炸毁所有内容。如果在输出中找到这样的数字,则说明您已经遇到了该错误。

您如何解决此问题?

更改添加(激活)约束的顺序可能最终会更改内部引擎中的计算顺序,结果是,随着数学运算的完成,该问题将消失,而不会引起任何精度方面的问题。

当您更改了视图的内容压缩抗性或内容拥抱优先级时,似乎更经常出现此问题,因此请尝试注释掉任何这样做的代码,以查看是否导致此错误发生,或者将其重新排序为更早发生或更高版本的约束设置代码。

有关我的具体情况的更多详细信息:

我在iOS上遇到了崩溃。重现它的步骤非常有趣:

  1. 包含表格视图的视图控制器被推到屏幕上(在导航控制器中)。
  2. 表格视图必须包含足够的单元格,因此它们并不都适合可见区域,然后必须滚动到最后一个单元格,然后再备份一点(大概是,这导致单元格被重用,这触发了这个问题)。
  3. 然后,当将包含表视图的视图控制器从导航堆栈中弹出时,弹出动画完成后,应用程序将立即崩溃,此时该视图控制器的视图已从视图层次结构中删除。

经过大量的试验和错误,我能够将问题归结为一件具体的事情:UIImageView在每个表格视图单元格中为a设置内容压缩阻力和优先级在这种情况下,将使用单元格内的“自动布局”来定位图像视图,并且要实现正确的布局,图像视图必须恰好是其固有内容大小(其图像大小)。

这是有问题的代码:

// 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块的默认行为)。当此类块在后台队列上运行并释放时,它捕获的强引用将在同一队列上释放,您可能会遇到众所周知的释放问题

  1. 在视图控制器中,请确保self在所有不需要强引用的中使用弱引用(并且可以在后台运行)。您可以这样声明:__weak typeof(self) weakSelf = self;在块之前—并weakSelf在块内部使用

  2. 对于保存对视图的引用的任何局部变量,也是如此—确保将其值捕获为弱引用。

另一种可能性

在我的工作中,当隐藏视图参与布局时,我在iOS 6上遇到了类似的问题从层次结构(-[UIView removeFromSuperview])中删除视图,而不是将hidden属性设置为YES,为我解决了这个问题。

遇到相同的问题,通过在IB中一次删除一个约束来解决该问题,直到解决崩溃为止。这将其范围缩小到了令人讨厌的约束。然后,我恢复了上述约束,但撤消了以下条款:

在此处输入图片说明

您可能很幸运,并且能够轻松解决AL问题。

对于任何在版本高于8.0的iOS中遇到此问题的人,Apple文档都声明使用NSLayoutConstraint上的“ active”属性,而不是UIView上的removeConstraint / addConstraint函数。Apple Docs addConstraint参考

为了使@smileyborg的出色答案更具实用性:

如果您对乘法器有任何约束,可能会遇到浮点精度问题,则可能会发生这种情况。

解决:

  1. 遍历所有具有乘数的约束(在布局代码中或通过手动编辑情节提要/笔尖并搜索multiplier=)。
  2. 如果乘数不是两个浮点数的“漂亮”幂,请将其转换为最接近的一个(可以使用浮点计算器

做2的简单方法是输入您想要的数字和计算器,然后关闭尾数中的低精度位,直到该值与计算器底部的舍入十进制值匹配。

在我的情况下,这是一个比例宽度约束,乘数为8:9。我将其更改为7:9,并且有效。

顺便说一句,找到约束的最简单方法是开始从视图控制器中删除视图。使用二进制算法来做到这一点:)删除一半的视图,然后移除一半的视图,使应用程序崩溃,依此类推。

对我而言,问题是在设置UICollectionViewCell的属性时调用dequeueReusableCellWithReuseIdentifier之后,我正在一次删除适合自己的约束。解决方案是改为调用:

    [_myUICollectionViewCell setNeedsUpdateConstraints];

并覆盖:

    -(void)updateConstraints 

并把我弄乱。似乎您不能随便删除约束。

我刚刚在我正在开发的OSX应用程序的OSX Mavericks下偶然发现了相同的错误,但是与给出的其他答案不同,我绝对没有任何其他线程与UI对象交互,并且所讨论的视图层次结构绝对可见太。我也不用块。奇怪的是,当我删除了NSTextField的垂直约束时,问题就消失了。

FWIW问题视图,将其从其父视图中删除会导致“内部错误。找不到传入行头的传出行头”错误,这是许多侧面板控件之一,这些控件共同显示了可以剪切的主视图中对象的属性,复制,创建等。这意味着用户可以相当快地将新对象粘贴到主视图中,这意味着侧面板的控件被破坏了,新对象的创建也非常迅速。当然,对于主线程中的所有内容,这应该没有什么不同,但是似乎可以做到。

引起问题的确切约束是

[自我addConstraint:[NSLayoutConstraint约束WithItem:控制属性:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual等于Item:其他属性:NSLayoutAttributeHeight乘数:1.4常数:0.0]];

控件是导致问题的(可编辑)NSTextField,“ other”是另一个(不可编辑)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;

当我使用nil参数调用removeConstraints:时,我遇到了崩溃。

当我在wAnyhAny模式下仍然缺少约束时,发生此崩溃,修复此错误消除了错误。

正如该线程中的其他答案所表明的那样,这在某种程度上是一个无效的自动布局/约束问题,尽管它对于“无效”的定义似乎非常挑剔。

幸运的是,自上次提交以来,我没有做过太多更改,并且能够追踪到令人讨厌的更改。对于我来说,UIImageView以相等的宽度和固定的2:3长宽比观看10个水平的视图是个问题。

仅在离开UIViewController包含该图像行的时才发生崩溃每个UIImageView都设置为UIViewContentModeScaleAspectFill删除此内容模式更改(在设置UIImages之前完成)似乎可以解决我的问题,但不是可接受的解决方案。我最终消除了宽高比限制,仅对每个图像使用固定的宽度和高度。

为什么这会使我的应用程序崩溃,我不知道...崩溃也只能在运行iOS 7.1.2的iPhone 4s上重现。我试图在运行iOS 9.1的iPhone 4s模拟器上重现同样的崩溃,但没有成功。在运行iOS 9.1的iPhone 5上运行时,它也不会崩溃。

希望可以帮助某人

根据Apple文档:

在针对iOS 8.0或更高版本进行开发时,请将约束的active属性设置为YES,而不是直接调用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
            }
        }
本文地址:http://ios.askforanswer.com/zidongbujuremovefromsuperview-removeconstraintsyinfayichangbingyanzhongbengkui.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!