使用程序化调整大小的Autolayout UIImageView不遵循约束

时间:2013-06-25 13:54:23

标签: ios uiimageview autolayout

很抱歉打扰但是我正在尝试延迟加载几个imageViews然后按比例调整它以适应UITableView中的内容。我也在尝试(Unwisely或许?)第一次使用Autolayout。我不明白为什么约束在这种情况下不起作用。这是我在将正确的图像加载到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;
}

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

Height Equals:  83
Align Bottom to: Background Image View
LeadingSpace to: Table View Cell

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

2 个答案:

答案 0 :(得分:9)

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

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

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

所以,你会做类似的事情:

_myWidthConstraint.constant = 300.f;

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

- (void)updateConstraints
{
    [super updateConstraints];
    _myWidthConstraint.constant = 300.f;
}

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

    [self setNeedsUpdateConstraints];

希望这有帮助!有关详细信息,请查看Ole Begemann的优秀文章10 Things You Need To Know About Cocoa Autolayout

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

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

答案 1 :(得分:1)

我也面临同样的问题。 imageview中的图片对于imageview来说太大了,contentMode设置为AspectFill

我通过取消选中'Autoresize Subviews'解决了这个问题。 enter image description here