我有一个使用AutoLayout和约束设置的UIImage视图。我使用
将图像适合图像视图 self.selectPhoto.contentMode = UIViewContentModeScaleAspectFit;
NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.selectPhoto attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.selectPhoto attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.caption attribute:NSLayoutAttributeTop multiplier:1 constant:-35];
[self.view addConstraint:topConstraint];
[self.view addConstraint:bottomConstraint];
self.selectPhoto.image= existingImage;
效果很好。因为UIImageView是使用AutoLayout设置的,而UIImage是使用Aspect Fit显示的,所以我不知道图像的确切帧。我希望图像的左上角在图像视图中为0,0,因为我有另一个较小的图像,用户可以在其上移动。
例如:由于瀑布图像的方向,UIImageView中的左上角是0,23ish。当图像高度>图像宽度(图像视图的原点)是66,0。这是一个问题,因为我想绘制两个图像的用户上下文并保存为新图像。我无法做到这一点,因为我不知道2个月图像放在瀑布图像上的位置,因为我不知道瀑布图像的来源。我知道2个月图像在图像VIEW上的位置,但图像不占用整个imageView。由于AutoLayout和Aspect Fit,它根据图像的大小/方向而有所不同。我将2Months Pan手势添加到瀑布图像视图中,但起源不对齐。附加到2Months视图的平移手势代码如下
-(void) handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
self.itemToEdit.stickerLocation= recognizer.view.frame;
NSLog(@"The location of the sticker is %f and y is %f", recognizer.view.frame.origin.x, recognizer.view.frame.origin.y);
}
有没有办法让UIImageView适应实际显示的UIImage?基本上我想做self.selectPhoto.frame = self.selectPhoto.image.frame
之类的事情
哪个我不能做。
总结:在使用AutoLayout和Aspect fit放置后,我如何知道imageView的绝对原点?
答案 0 :(得分:2)
根据this Stack Overflow answer,我们可以通过访问UIImage
属性来获取size
的大小。
所以,从这里开始,最简单的方法是使用autolayout。
使用图片视图设置故事板或xib。继续并为您的图像视图提供明确的宽度和高度约束。现在,填写图像视图周围的其余约束。但请记住,当我们将不同的图像放入图像视图时,图像视图上的显式宽度/高度将会发生变化,因此我们的其他自动布局约束必须牢记这一点。
现在,为我们明确的高度和宽度约束添加IBOutlet
。这可以像我们为任何其他UI元素添加插座一样完成。只需 Ctrl +从IB中的约束拖动到源文件。
现在我们有这样的事情:
@property (nonatomic, weak) NSLayoutConstraint *imageHeight;
@property (nonatomic, weak) NSLayoutConstraint *imageWidth;
现在,每次我们更改图片视图的图片时,我们都会更新这些约束的constant
部分:
self.imageHeight.constant = newImage.size.height;
self.imageWidth.constant = newImage.size.width;
现在,使用上述方法意味着我们的图像视图将始终具有与图像完全相同的大小。这可能意味着它在屏幕边界之外延伸或仅填满屏幕的一小部分。
另一种方法是使用宽高比约束。再次,首先为图像视图提供宽高比约束,将其高度与宽度相关联。现在转到并为视图设置其余的自动布局约束。也许您希望将左上角固定到特定位置。
在您执行此操作时,您还可能希望为图像视图的宽度和高度设置一些小于或等于约束。这些约束将确保无论图像的大小或形状如何,图像视图都将小于您指定的大小(因此保留在屏幕上)。
再次为您的宽高比限制添加插座。每次我们更改图像视图的图像时,我们都会对其进行修改:
@property (nonatomic, weak) NSLayoutConstraint *imageRatio;
现在,我们将修改比率约束的constant
属性,而不是multiplier
属性(我们希望将其保留为零)。宽度是在顶部还是在底部取决于约束的连接方式,因此可能需要一些试验和错误。但它的要点是,我们想要这样的东西:
self.imageRatio.multiplier = newImage.size.height / newImage.size.width;
(同样,你可能需要翻转高度/宽度。)