2

我有一个使用自动布局很好地设置的视图。该视图包含一系列从上到下堆叠的标签。我允许这些标签的内在大小来确定视图的大小。

最后一步是从图像中添加背景。我首先尝试了该colorWithPatternImage方法,UIColor但这并不是我想要的。我不想平铺图像,我不能保证它总是大于视图的固有大小。

同样,将 a 添加uiImageView到视图本身也不太奏效。当我想根据标签保持固有大小时,视图将扩展以适应图像。

我想我正在寻找的是以下内容。

1)背景应该对视图的大小没有影响。2) 应缩放图像以填充视图,但应保持原始纵横比(如有必要,请裁剪边缘)。

任何想法表示赞赏。

4

3 回答 3

5

在我的情况下,我需要它用于 aUIImageView中的动态大小视图UITableViewCell,但图像拒绝缩小到其内部大小以下,而是作为超级视图的最小大小约束。我可以让它忽略内部大小的唯一方法是在创建单元后立即降低执行它的优先级:

[imageView setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; [imageView setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisVertical];

在此之后,我所有的约束都神奇地开始起作用了。根据 Mundi 的回答,在 OP 的情况下,UIViewContentModeScaleAspectFill还需要设置。

于 2014-12-11T10:22:57.963 回答
0

这是我将如何处理这个问题。希望它有所帮助。:)

CGRect        contentFrame     = CGRectMake(0, 0, self.view.frame.size.width, 0);      //  This will be the frame used to create the background image view.
UIEdgeInsets  contentInsets    = UIEdgeInsetsMake(20, 20, 20, 20);      //  The margins by which the labels will be inset from the edge of their parent view.
CGFloat       labelHeight      = 21;
CGFloat       verticalGap      = 8;                        //  The vertical space between labels
CGFloat       y                = contentInsets.top;
int           numberOfLabels   = 10;

for (int i = 0; i < numberOfLabels; i++) {

    CGRect   frame  = CGRectMake(contentInsets.left, y, self.view.frame.size.width - (contentInsets.left + contentInsets.right), labelHeight);
    UILabel *label  = [[[UILabel alloc] initWithFrame: frame] autorelease];

    //  customize the label here

    [self.view addSubview: label];
    contentFrame = CGRectUnion(contentFrame, label.frame);

    y += labelHeight + verticalGap;
}

contentFrame.size.height += contentInsets.bottom;

UIImageView *backgroundImageView = [[[UIImageView alloc] initWithFrame: contentFrame] autorelease];
[backgroundImageView setClipsToBounds: YES];
[backgroundImageView setContentMode: UIViewContentModeScaleAspectFill];
[backgroundImageView setImage: [UIImage imageNamed: @"background_image.png"]];
[self.view insertSubview: backgroundImageView atIndex: 0];
于 2013-07-26T15:55:41.203 回答
0

在 Interface Builder 中,将 aUIImageView作为第一个子视图添加到视图中。确保其大小始终与视图匹配。

然后,在 Interface Builder 或代码中,设置contentMode

backgroundImageView.contentMode = UIViewContentModeScaleAspectFill;
于 2013-07-26T14:00:01.940 回答