我只在IB中使用了自动布局,并且想知道如何在调整大小后以编程方式将UIImageView设置为垂直和水平居中。
基本上UIImageView包含一张照片,然后调整UIImageView以适应照片。在这个过程之后,我想知道如何设置约束以便正确定位图像。
下面的代码显示了加载图像和设置UIImageView的过程。在不使用AutoLayout的情况下手动完成定位。
- (void)setupUI {
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
self.imageViewCanvas.translatesAutoresizingMaskIntoConstraints = YES;
[self.imageViewCanvas setFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
self.btnTool.alpha = 0;
}
- (void)loadNewImageIntoCanvas {
[self.imageViewCanvas setImage:self.imageToEdit];
[self imageSizeAfterAspectFit:self.imageViewCanvas];
[UIImageView animateWithDuration:0.2 animations:^{
self.imageViewCanvas.alpha = 1;
} completion:^(BOOL finished) {
[self showBTNTool];
}];
}
- (void)resetCanvasSize {
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
[self.imageViewCanvas setFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
}
-(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
CGRect newSize = [self frameForImage:self.imageViewCanvas.image inImageViewAspectFit:self.imageViewCanvas];
float newwidth = newSize.size.width;
float newheight = newSize.size.height;
float new_x = (screenWidth / 2) - (newwidth / 2);
float new_y = (screenHeight / 2) - (newheight / 2);
[self.imageViewCanvas setFrame:CGRectMake(new_x, new_y, newwidth, newheight)];
return CGSizeMake(0, 0);
}
-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView {
float imageRatio = image.size.width / image.size.height;
float viewRatio = imageView.frame.size.width / imageView.frame.size.height;
if(imageRatio < viewRatio)
{
float scale = imageView.frame.size.height / image.size.height;
float width = scale * image.size.width;
float topLeftX = (imageView.frame.size.width - width) * 0.5;
return CGRectMake(topLeftX, 0, width, imageView.frame.size.height);
}
else
{
float scale = imageView.frame.size.width / image.size.width;
float height = scale * image.size.height;
float topLeftY = (imageView.frame.size.height - height) * 0.5;
return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
}
}
答案 0 :(得分:3)
为了使用自动布局居中显示图像视图,您还需要对宽度和高度进行约束。不仅是centerXAnchor和centerYAnchor。
因为UIImageView
没有intrinsicContentSize。
(请注意,centerXAnchor
和centerYAnchor
方法仅适用于iOS 9.0 +)
self.imageView.translatesAutoresizingMaskIntoConstraints = NO;
[self.imageView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
[self.imageView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;
[self.imageView.widthAnchor constraintEqualToConstant:self.imageWidth].active = YES;
[self.imageView.heightAnchor constraintEqualToConstant:self.imageHeight].active = YES;
答案 1 :(得分:1)
很确定你可以这样说。
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.imageViewCanvas attribute: NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.imageViewCanvas attribute: NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
但这还不足以满足所有必要的限制。 IMO,如果您需要动态更改约束,为它们创建IBOutlet并更改其常量属性,则在IB中设置约束会更容易。
例如,您可以为图像视图的高度约束创建一个IBOutlet,将其称为imageViewHeightConstraint,另一个用于图像视图的宽度约束,将其称为imageViewWidthConstraint,然后您可以说:
self.imageViewHeightConstraint.constant = 400;
self.imageViewWidthConstraint.constant = 400;