Autolayout UIImageView与编程重新大小不遵循约束

Rym*_*nel 2 uiimageview ios autolayout

很抱歉打扰但我正在尝试延迟加载几个imageViews,然后按比例调整它与UITableView中的内容.我也在尝试(Unwisely或许?)第一次使用Autolayout.我不明白为什么约束在这种情况下不起作用.这是在我将正确的图像加载到UIImageView之后用来调整UIImageView大小的代码.

// Scale the image view and return it.
- (UIImageView *) scaleImageViewForScreenWidth:(UIImageView *)imageView {
    UIImage *imgFromView = [imageView image];
    CGRect newFrame = CGRectMake(0, 0, imgFromView.size.width, imgFromView.size.height);

    float imgFactor = newFrame.size.height / newFrame.size.width;
    newFrame.size.width = [[UIScreen mainScreen] bounds].size.width;
    newFrame.size.height = newFrame.size.width * imgFactor;
    [imageView setFrame:newFrame];
    return imageView;
}
Run Code Online (Sandbox Code Playgroud)

就约束而言.我正在尝试将带有阴影的Label和UIImageView附加到主imageview的底部.以下是我在imageview中应用于底部阴影的约束.底部阴影约束是:

Height Equals:  83
Align Bottom to: Background Image View
LeadingSpace to: Table View Cell
Run Code Online (Sandbox Code Playgroud)

我没有得到我想要的东西.有任何想法吗?我觉得我在和autolayout战斗.

Max*_*eod 9

按照要求!以下是使用Autolayout的一些指导原则应该会有很多帮助.

首先,理想的方法是让您在Interface Builder中进行设置,以便不需要进一步编程.因此,如果 - 例如 - 视图的边界发生变化,那么您的视图将根据需要自动调整.

如果这不能完成业务,那么您可能必须以编程方式更新约束.现在,我提到的黄金规则是你更新约束.抵制更新底层UIView框架的诱惑!

所以,你会做的事情如下:

_myWidthConstraint.constant = 300.f;
Run Code Online (Sandbox Code Playgroud)

接下来要注意的是,您应该在特定的位置执行此操作,这是在您的UIView子类方法中updateConstraints:

- (void)updateConstraints
{
    [super updateConstraints];
    _myWidthConstraint.constant = 300.f;
}
Run Code Online (Sandbox Code Playgroud)

你是如何触发的?通过调用:

    [self setNeedsUpdateConstraints];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!欲了解更多信息,请查看Ole Begemann 关于Cocoa Autolayout的10篇优秀文章.

不要忘记WWDC视频.这些都很重要!

此外,现在有一本书iOS Auto Layout Demystified.虽然我买了它,但我还没机会读它.虽然看起来确实不错.