特定于编程设备的iOS约束为零

时间:2015-03-25 20:10:17

标签: ios objective-c iphone

我遇到了一个有趣的问题,只出现在带有视网膜显示屏的iPhone 6/6 +和iPad mini上。

在以下代码中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if(self.seeMoreContents)
    {
        BOOL isText = [self.seeMoreContents isText];
        self.imageView.hidden = isText;
        [self.textView removeConstraint:self.textHeightConstraint];
        [self.textWrapperView removeConstraint:self.textWrapperHeightConstraint];

        if (!isText)
        {
        __weak FCSeeMoreViewController *weakSelf = self;
            [self.imageView setImageByFlashcardSide:self.seeMoreContents completion:^(BOOL preloaded){
                weakSelf.imageView.center = CGPointMake(weakSelf.view.frame.size.width / 2, weakSelf.view.frame.size.height / 2);
                [weakSelf.scrollView setContentOffset:CGPointMake(0, 0)];
            }];
        }
    }
}


- (void)viewDidLayoutSubviews
{
    if ([self.seeMoreContents isText])
    {
        self.textView.text = self.seeMoreContents.text;
        self.textView.font = self.fontForContents;

        self.textWrapperView.hidden = NO;
        [self.textView sizeToFit];
        CGFloat height = self.textView.frame.size.height;
        [self updateView:self.textView withConstraint:self.textHeightConstraint ofValue:height];
        [self updateView:self.textWrapperView withConstraint:self.textWrapperHeightConstraint ofValue:height + self.wrapperMargin];

        [self.scrollView setContentSize:CGSizeMake(self.textView.frame.size.width, height + self.scrollTextMargin)];
        [self.scrollView setContentOffset:CGPointMake(0, -self.wrapperScrollVerticalConstraint.constant)];
    }
    [super viewDidLayoutSubviews];
}

- (void)updateView:(UIView*)view withConstraint:(NSLayoutConstraint*)constraint ofValue:(CGFloat)value
{
    constraint.constant = value;
    [view addConstraint:constraint];
}

udpateView的两个消息通过时,约束变为零。我可以将此归因于奇怪的垃圾收集行为,但它只发生在iPhone 6/6 +和迷你视网膜iPad上。

我已经更改了整个控制器以更好地工作并且不以编程方式设置约束,但我想知道在特定设备上如何/为什么会发生这种情况。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

在UIViewController中覆盖此方法以检测“traits”的更改:

func willTransitionToTraitCollection(_ newCollection: UITraitCollection,
       withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

这是您拦截约束更改以在正确的时间获取它们的地方,否则它就是竞赛,您的代码可能会丢失。

我怀疑没有使用该功能来获得正确的时机可能就是为什么你没有看到一致的结果。我在一段时间内遇到了同样的问题 - 当我去寻找它时,没有找到应该存在的约束。

关于出现和消失的神秘约束的另一件事当然是UIView的

translatesAutoresizingMaskIntoConstraints

属性,如果为true(默认值),则会导致iOS动态创建约束,除了您可能以编程方式创建或在Interface Builder中创建的任何内容。我注意到一些iOS生成的约束可能会在不同的设备和方向上消失,因为应用和删除此类约束的iOS实现是一个黑盒子。