【发布时间】:2015-01-04 01:16:58
【问题描述】:
请在下面查看我的答案,我有一个可行的解决方案
我已经完全重写了代码,所以它更小更整洁,并且达到了相同的结果。
更新:看起来 UIImageView 的内在内容大小在加载大图像时正在调整,这会抛出其布局并使其成为设备窗口和滚动视图宽度的两倍。我需要弄清楚如何解决这个问题。下面的代码做了一个小改动,减少了 UIImageView 的宽度,但不允许我将其设置为窗口宽度的 100%。
[captionImageView setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisHorizontal];
我为我的视图设置了以下内容,我的问题是 UIImageView 内的图像正在推动其包含视图的宽度比设备窗口宽。
我有一个 ViewController,它在 for 循环中加载和添加子视图,一切似乎都在那里工作正常。
在这些子视图中,我尝试使用自动布局来实现以下目标:
添加一个 UIImageView 并使其与父窗口宽度相同
将 UIImage 加载到其中并使用 UIViewContentModeScaleAspectFill 确保图像加载良好且按比例加载。
- 在这一切下面加载一个 UITextView
- 在 for 循环中重复这个过程,这样它们就可以很好地堆叠在一起。
我在 Visual 格式化语言中使用约束来尝试将 UIImage 视图的大小设置为父视图的宽度,我希望它是设备窗口的宽度。
如果我指定约束如下:
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[captionImageView(320)]|" options:0 metrics:metrics views:views]];
然后它工作正常,但这不是理想的解决方案,因为我希望 UIImageView 与设备的宽度齐平,设置固定宽度是不好的做法
如果我像这样指定约束:
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[captionImageView]|" options:0 metrics:metrics views:views]];
然后尺寸为 960px 的 UIImage 将强制父容器视图也为该尺寸。
我将自定义视图内容加载到滚动视图中,因此水平滚动很糟糕。
请注意,我使用 UIView 类别来指定 view.translatesAutoresizingMaskIntoConstraints 设置为 NO。
#import "UIView+Autolayout.h"
@implementation UIView (Autolayout)
+(id)autoLayoutView {
UIView *view = [self new];
view.translatesAutoresizingMaskIntoConstraints = NO;
return view;
}
@end
自定义视图的代码如下。关于如何确保 UIImageView 的大小不会超出设备窗口范围的任何想法?
//
// FigCaptionView.m
//
//
// Created by Matthew Finucane on 18/12/2014.
// Copyright (c) 2014 The App. All rights reserved.
//
#import "FigCaptionView.h"
#import "UIView+Autolayout.h"
@interface FigCaptionView(){}
@end
@implementation FigCaptionView
-(id)initWithData:(NSDictionary *)viewData {
if((self = [FigCaptionView autoLayoutView])) {
self.figCaptionData = viewData;
}
return self;
}
-(void)layoutItems {
[self setBackgroundColor:[UIColor redColor]];
/**
* The container view for everything
*/
UIView *containerView = [UIView autoLayoutView];
/**
* Setting up the caption image
*/
UIImageView *captionImageView = [UIImageView autoLayoutView];
[captionImageView setContentMode:UIViewContentModeScaleAspectFill];
/**
* Grabbing the image (not yet the right way to do this)
*/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://placekitten.com/960/240"] options:0 error:nil]];
dispatch_async(dispatch_get_main_queue(), ^{
captionImageView.image = image;
});
});
/**
* Setting up the caption image
*/
UITextView *captionTextView = [UITextView autoLayoutView];
[captionTextView setText:@"Sample paragraph text will go in here. Sample paragraph text will go in here. Sample paragraph text will go in here. Sample paragraph text will go in here. Sample paragraph text will go in here.Sample paragraph text will go in here"];
/**
* Adding the container view
*/
[self addSubview:containerView];
[containerView addSubview:captionImageView];
[containerView addSubview:captionTextView];
[captionTextView setBackgroundColor:[UIColor blueColor]];
/**
* Dictionaries for autolayout: views and metrics
*/
NSDictionary *views = NSDictionaryOfVariableBindings(containerView, captionImageView, captionTextView);
NSDictionary *metrics = @{@"imageHeight": @"160.0", @"margin": @"20.0"};
/**
* Setting up the constraints for this view
*/
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView]|" options:0 metrics:metrics views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView]|" options:0 metrics:metrics views:views]];
/**
* Container view constraints
*
* The first constraint is the one that might be causing me trouble.
*/
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[captionImageView]|" options:0 metrics:metrics views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[captionTextView]|" options:0 metrics:metrics views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[captionImageView(imageHeight)][captionTextView]|" options:NSLayoutFormatAlignAllLeft metrics:metrics views:views]];
for(UIView *view in self.subviews) {
if([view hasAmbiguousLayout]) {
NSLog(@"OOPS");
NSLog(@"<%@:0x%0x>", view.description, (int)self);
}
}
}
@end
【问题讨论】:
标签: ios uiimageview uiimage autolayout