以编程方式使用自动布局将图像定位到视图的中心

Locating an image to centre of a view with auto layout programatically

我正在尝试使用 NSLayoutConstraint 将图片定位到视图的中心,如下所示:

NSInteger userPictureRadius = 50.0F;

UIImageView *imgv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width / 2 - userPictureRadius,
                                                                  self.topArea.bounds.size.height / 2 - userPictureRadius + 20,
                                                                  userPictureRadius * 2,
                                                                  userPictureRadius * 2)];

NSString *urlString= [NSString stringWithFormat:@"%@%@",[[Parameters sharedInstance] BASE_URL], [[MyCredentialStore sharedInstance] getPicturePath]] ;

[imgv sd_setImageWithURL:[NSURL URLWithString:urlString]  placeholderImage:nil];
imgv.layer.cornerRadius = imgv.frame.size.height / 2;
imgv.layer.masksToBounds = YES;
imgv.layer.borderWidth = 0;
[imgv.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imgv.layer setBorderWidth: 2.0];
[imgv setTranslatesAutoresizingMaskIntoConstraints:NO];

...

[self.topArea addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[imgv(100)]-|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:elementsDictionary]];

[self.topArea addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[imgv(100)]-|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:elementsDictionary]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_topArea]-|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:elementsDictionary]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_topArea]-[_tableView]-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:elementsDictionary]];

我这里有两个问题:

  1. 图像出现在屏幕的左上角。

  2. 顶部区域和屏幕边框之间有空白space。

你能告诉我我的代码有什么问题吗?

如果您选择自动布局,则使用手动坐标毫无意义

UIImageView *imgv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width / 2 - userPictureRadius,
                                                                  self.topArea.bounds.size.height / 2 - userPictureRadius + 20,
                                                                  userPictureRadius * 2,
                                                                  userPictureRadius * 2)];

应该变成公正

UIImageView *imgv = [[UIImageView alloc] init]; 

显示您如何构造 elementsDictionary 的代码,以便我可以尝试进一步提供帮助。

另外 post 一张您所面临的视觉问题的小屏幕截图会更好。

无法使用自动布局视觉格式语言 (VFL) 进行这样的居中。您提供的 VFL 字符串通过标准距离将图像视图的边缘与其超级视图相关联。例如,H:|-[imgv(100)]-| 建立三个约束:图像视图的前缘等于其父视图的前缘加上标准距离,图像视图的宽度为 100 点,父视图的后缘等于图像视图的后缘加上标准距离.这将导致指定图像视图及其父视图的大小。我想图像视图将在其父视图中居中,但它的父视图可能不是您期望的大小。

要使一个视图在另一个视图中水平居中,请使用如下内容:

NSLayoutConstraint* constraint = [NSLayoutConstraint constraintWithItem:imgv
                                                              attribute:NSLayoutAttributeCenterX
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:imgv.superview
                                                              attribute:NSLayoutAttributeCenterX
                                                             multiplier:1
                                                               constant:0];
[imgv.superview addConstraint:constraint];

你会为垂直方向做类似的事情。如果你想强制图像视图为特定大小,你可以为此使用单独的约束。 (如果您愿意,可以为此使用 VFL。它类似于 H:[imgv(100)]。请注意,那里与另一个视图无关,只是宽度。)