想象一下这个场景.你有一个UI ImageView和一个UIButton.第一个是300×360,第二个是210×70. imageview包含目录图像,按钮显示“打开目录”.

我想根据这些要求在主视图中定位元素:

>两个元素应水平居中,即center.x坐标应全部相等(视图,图像和按钮);
>这两个元素应按以下方式垂直居中:分隔符(灵活) – imageview – 分隔符(固定,假设30分) – 按钮 – 分隔符(灵活).最上面和最下面的分隔符应该具有相同的大小(这是居中的含义).

我无法使用NSLayoutConstraint使其工作.

到目前为止,我所做的一直是使用NSLayoutAttributeCenterX和NSLayoutRelationEqual将两个元素的X坐标居中到同一个视图属性.

根据我的想法,最后一部分是修复它们的垂直对齐.
我尝试使用@“V:| – [imageview(360)] – [button(70)] – |”但它不起作用(无法同时满足约束.).

如果我使用@“V:| – [imageview(360)] – [按钮] – |”我觉得一切都很好.也就是说,顶部是完美的但是按钮被拉伸以填充内部分隔符和视图底部之间的间隙.

如何使这些元素固定大小并让自动布局只是弄清楚如何将它们放在视图中?

解决方法

通过这样做,我能够做到这一点:
NSNumber *sepHeight = @60.0F;

// Center the two views horizontally
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:imageView
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1
                                                       constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:button
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1
                                                       constant:0]];

// Position the two views one below the other,using the separator height defined above
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageview]-sepHeight-[button]"
                                                                  options:0
                                                                  metrics:NSDictionaryOfVariableBindings(sepHeight)
                                                                    views:views]];

// Force the button distance from the bottom to be the half of the size of the content
CGFloat constant = (imageview.frame.size.height + button.frame.size.height + [sepHeight floatValue]) / 2.0;
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:button
                                                      attribute:NSLayoutAttributeBottom
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterY
                                                     multiplier:1
                                                       constant:constant]];

棘手的部分是恒定值.该值是所有视图高度的一半,包括它们的分隔符.这意味着,如果imageview的高度为360,按钮的高度为70,分隔符为60,则该常量将为(360 70 60)/ 2 = 245.

确实应该有一种更聪明的方式,但是现在我觉得这没关系.

ios – 使用NSLayoutConstraint垂直居中两个视图的更多相关文章

  1. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 如何垂直居中UICollectionView内容

    我试图动态地居中UICollectionView的内容,但是现有的解决方案都没有考虑到每行可能有多个单元格的事实.我在这里尝试了这个centercustomtitleinUINavigationBar?以及两种解决方案:UICollectionViewverticallyCentred,无济于事.我很惊讶iOS默认情况下无法做到这一点,甚至更多的是无法获得当前显示的行数(这也解决了我的问题).此外

  3. UITableViewCellAccessoryCheckmark涵盖iOS 7上的单元格分隔符

    在iOS7上使用此代码会导致分隔符视图被覆盖或缩短:如何修复分隔符视图?

  4. ios – 页脚视图的颜色总是比UITableView分隔符的颜色更暗

    在我的UITableView中,我设置了这样的分隔符颜色:我像这样设置页脚的颜色:但是,页脚视图的颜色总是比分隔符的颜色更暗,如下所示:如何让它们成为完全相同的颜色?谢谢.解决方法从iOS6.0开始,您可以使用下面提到的UITableView的委托方法来更改页脚视图的背景颜色–

  5. ios – 使用NSLayoutConstraint垂直居中两个视图

    解决方法通过这样做,我能够做到这一点:棘手的部分是恒定值.该值是所有视图高度的一半,包括它们的分隔符.这意味着,如果imageview的高度为360,按钮的高度为70,分隔符为60,则该常量将为/2=245.确实应该有一种更聪明的方式,但是现在我觉得这没关系.

  6. ios – 可以增加UITableView分隔线的厚度吗?

    我看到无处不在试图增加这条线的厚度.有没有办法以编程方式做这个?

  7. ios – 来自Swift Xcode 6中的应用程序的iPhone电话

    我检查并尝试过以前的答案,如何直接从应用程序拨打电话,但我不断收到错误.我刚刚在储物柜中制作了一个按钮,并将其连接到视图控制器.它不断给我“错误审查”,“分隔符,但这并不解决任何事情.我需要向AppDelegate或其他任何内容添加代码吗?我真的想知道在斯威夫特这样做的方式.解决方法此代码将帮助您:要么

  8. ios – 在TabBar中的段之间添加分隔符

    我必须在TabBar的部分之间添加分隔符,如下图所示:我试图设置背景iamge为tabbar使用这个图像:但是当我旋转设备时我有问题.我使用的代码:此外,我尝试在图像的右侧添加一个分隔符,我用于abbar项,但没有结果.请问,请帮帮我吗?

  9. ios – 分段线在选择最后一行后显示

    我在所有的UITableView中看到一个奇怪的行为.这开始让我吃惊了我有简单的样式UITableViews.该部分的最后一行没有得到分隔符,它只是混合到段头.检查最后一行的高度,似乎苹果正在使其更大1px以从单元格中移除分隔符高度.问题是当我选择行,但拖动,分隔线显示,永远不会消失.如果我回去观看并回来,它将默认为关闭.我正在看到我的所有表视图,正常单元格和自定义单元格.当我取消选择时,我可以做些什么来确保最后一个分隔符保持不变?

  10. UIPopoverController(iOS7)中如何防止UITableView分隔符颜色变黑?

    任何帮助将不胜感激.解决方法设置在viewwillAppear希望这可以帮助

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部