在具有特定约束的滚动视图中显示图像(使用自动布局)

2024-01-28

我想在视图控制器中显示标题和图像下方。 我的限制是:

  • 标签可以位于屏幕顶部 50 像素处
  • 标签可以有一行或多行
  • 图像可以位于我的标签的 50 像素处
  • 图像必须具有屏幕的宽度
  • 滚动视图必须根据所有这些元素的大小进行滚动

我有一个带有滚动视图的视图控制器:

-视图控制器

---view

------滚动视图

---------容器视图

- - - - - - 标签

- - - - - - 图像

我想使用故事板和自动布局。

我已成功正确对齐标签,但无法在标签的 50 像素处显示图像并保持其比例。

如果我对图像视图使用“宽高比”或“缩放填充”,在这种情况下,标签和图像的尺寸为 50px,就像我想要的那样。

与方面适合:

有刻度来填充:

但如果我使用“宽高比填充”,我不明白图像是如何显示的。

使用方面填充:

我已经关注这个问题大约三天了,这让我抓狂。 我还尝试使用不可见的“间隔”视图...... 我找不到解决方案。

我使用 Xcode 6 快速开发。

编辑 1:通过 vacawama 建议解决图像定位问题

为您的 imageView 添加一个 @IBOutlet 并为您的视图控制器添加一个属性以跟踪约束:

@IBOutlet weak var imageView: UIImageView!
var aspectRatio:NSLayoutConstraint?

然后添加新图像:

let tree = UIImage(named: "WinterTree.jpg")!

imageView.image = tree
aspectRatio = NSLayoutConstraint(item: imageView, attribute: .Height, relatedBy: .Equal, toItem: imageView, attribute: .Width, multiplier: tree.size.height/tree.size.width, constant: 1)
imageView.addConstraint(aspectRatio!)

编辑2:但之后,我的视图不再滚动

我的容器视图的约束:

我删除了底部约束,以便容器视图的高度适应内容,但出现错误:


问题是 imageView 的高度没有改变,所以图像只是在旧框架上居中。视图模式设置(Aspect Fit、Scale To Fit 或 Aspect Fill)不会更改 imageView 的高度。您需要对 imageView 的高度进行约束,但此约束会根据您的图像而变化。

我能够通过执行以下操作来完成这项工作。

  1. 我将图像的宽度限制为视图的宽度。

  2. 我向图像添加了 AspectRatio 约束。这设置了宽度与高度的比率,并且由于我已经指定了图像的宽度,所以现在将完全指定高度。我本来希望在加载新图像时能够在代码中更新此约束(因为不同的图像具有不同的长宽比),但我只能更改constant来自代码而不是multiplier。因此,为了解决这个问题,我通过检查将其设置为占位符约束占位符 in the 属性检查器。这意味着这个约束将在构建时被删除。

  3. 在代码中,当我为 imageView 设置图像时,我添加了一个约束,通过乘数将 imageView 的宽度设置为 imageView 的高度。这取代了 Interface Builder 中设置的宽高比约束。

    首先,添加一个@IBOutlet为您的 imageView 和视图控制器的属性来跟踪约束:

    @IBOutlet weak var imageView: UIImageView!
    var aspectRatio:NSLayoutConstraint?
    

    然后添加新图像:

    let tree = UIImage(named: "WinterTree.jpg")!
    
    imageView.image = tree
    aspectRatio = NSLayoutConstraint(item: imageView, attribute: .Height, relatedBy: .Equal, toItem: imageView, attribute: .Width, multiplier: tree.size.height/tree.size.width, constant: 1)
    imageView.addConstraint(aspectRatio!)
    

    当需要更改图像时,请先删除之前的宽高比约束,然后再添加新的宽高比约束:

    imageView.removeConstraint(aspectRatio!)
    

我实现了类似于你的布局的东西。我的项目有一个按钮代替了您的标签,但其他方面是相似的。当用户按下按钮时,我的应用程序会将图像替换为具有完全不同宽高比的图像。这是文档大纲和我的项目的所有限制。


First Item:       WinterTree1.jpg.Width
Relation:         Equal
Second Item:      WinterTree1.jgp.Height
Constant:         1
Priority:         1000
Multiplier:       0.68

First Item:       WinterTree1.jpg.Leading
Relation:         Equal
Second Item:      ContentView.Leading
Constant:         8

First Item:       ContentView.Bottom
Relation:         Equal
Second Item:      WinterTree1.jpg.Bottom
Constant:         8

First Item:       ContentView.Trailing
Relation:         Equal
Second Item:      WinterTree1.jpg.Trailing
Constant:         8

First Item:       WinterTree1.jpg.Top
Relation:         Equal
Second Item:      Button.Bottom
Constant:         20

First Item:       Button.Top
Relation:         Equal
Second Item:      ContentView.Top
Constant:         20

First Item:       ContentView.Center X
Relation:         Equal
Second Item:      Button.Center X
Constant:         0

First Item:       Superview.Trailing
Relation:         Equal
Second Item:      ContentView.Trailing
Constant:         0

First Item:       ContentView.Leading
Relation:         Equal
Second Item:      Superview.Leading
Constant:         0

First Item:       Superview.Bottom
Relation:         Equal
Second Item:      ContentView.Bottom
Constant:         0

First Item:       ContentView.Top
Relation:         Equal
Second Item:      Superview.Top
Constant:         0

First Item:       ContentView.Width
Relation:         Equal
Second Item:      Superview.Width
Constant:         0

First Item:       Scroll View.Leading
Relation:         Equal
Second Item:      Superview.Leading
Constant:         0

First Item:       Scroll View.Top
Relation:         Equal
Second Item:      Superview.Top
Constant:         0

First Item:       Superview.Trailing
Relation:         Equal
Second Item:      Scroll View.Trailing
Constant:         0

First Item:       Bottom Layout Guide.Top
Relation:         Equal
Second Item:      Scroll View.Bottom
Constant:         0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在具有特定约束的滚动视图中显示图像(使用自动布局) 的相关文章

  • 使用 UItableViewCell 类型的表达式初始化“CustomCellView *”的指针类型不兼容

    你能帮我理解和 修复下面的错误吗 我不明白CustomCellView是一个子类UItableViewCell 代码已编译 但警告仍然存在 Incompatible pointer type initializing CustomCellV
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • 如何在 iOS 中将 Firebase 对象持久保存到磁盘?

    看起来Firebase http www firebase comiOS 实现不支持客户端模型的离线缓存 这在实践中意味着 对于需要身份验证的 Firebase 应用程序 您需要首先进行身份验证并等待 Firebase 完成登录 检查用户身
  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • 使用 Quartz 创建 PDF 注释 (iOS)

    有人设法使用 Quartz 在现有 PDF 中编写自定义注释吗 我已经使用 CGPDFDocumentRef 等渲染了 PDF 现在工作正常 我成功地阅读了 Annots 字典 if CGPDFDictionaryGetArray page
  • 与新 Apple Music 应用程序中相同的动态状态栏

    是否可以动态着色statusBar这是在新的苹果音乐应用程序 Edit iOS 8 4 中的新 Apple Music 应用程序具有此功能 打开应用程序 选择并播放歌曲 状态栏为白色 向下滑动播放器控制器以查看 我的音乐 控制器 它有黑色状
  • 在 ios 版 Ionic 中接收 URL

    我正在使用离子框架 我正在尝试设置一种从另一个应用程序接收网址的方法 就像 您在浏览器中 单击共享 然后将链接发送到另一个应用程序 我的应用程序 我找到了这个cordova https stackoverflow com questions
  • 二元运算符“/”不能应用于两个(Int)操作数[重复]

    这个问题在这里已经有答案了 我得到了Binary operator cannot be applied to two Int operands当我将以下代码放入 Xcode 中的 Swift Playground 时出错 func sumO
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 在情节提要中将 Segue 拖至自身

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • 带有 allowedEditing 的 UIImagePickerController 不允许平移裁剪

    我在这里看到这个问题 UIImagePicker 允许编辑卡在中心 https stackoverflow com questions 12630155 uiimagepicker allowsediting stuck in center
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • cameraOverlayView 防止使用 allowedEditing 进行编辑

    在我的应用程序中 使用以下行在拍摄照片后对其进行编辑 移动和缩放 效果很好 imagePicker setAllowsEditing YES 但如果我还使用cameraOverlayView 则编辑模式将不再起作用 屏幕出现 但平移和捏合手
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 检查 Swift 中关联类型是否符合协议

    在类似情况下 如何检查对象是否符合 可表示 协议 protocol Representable associatedtype RepresentType var representType RepresentType get set cla
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta

随机推荐

  • 从操作系统获取事件

    我在 Windows 上工作 但在 Mac 上却卡住了 我有 Canon SDK 并构建了一个JNA包装在它上面 它在 Windows 上运行良好 但在 Mac 上需要一些帮助 在sdk中 有一个函数可以注册回调函数 基本上 当相机中发生事
  • 递归 Haskell 函数似乎不会终止

    为了提高我的 Haskell 技能 我正在尝试解决2018 年代码的到来 https adventofcode com 正如预期的那样 我已经陷入了第一天 特别是第二部分 第二部分 您注意到设备重复相同的频率更改列表 以及结束 要校准设备
  • XCTestCase 未在 setUp 类方法中启动应用程序

    我正在使用 XCode 8 和 XCTestCase 我创建了一个类 setUp 函数 在所有测试之前运行一次 另一个 setUp 在每个测试用例之前运行 我希望应用程序在所有测试用例之前启动一次 如果我在类 setUp 中使用 launc
  • 使用 Naudio 将 MP3 文件转换为 WAV 文件时遇到问题

    瑙迪奥图书馆 http naudio codeplex com http naudio codeplex com 我正在尝试将 MP3 文件转换为 WAV 文件 但遇到了一个小错误 我知道出了什么问题 但我真的不知道如何解决它 这是我正在运
  • _GLIBCXX_USE_CXX11_ABI、GCC 4.8 和 ABI 兼容性

    我们收到了一些为 Linux 编译的库 a 可能是用 GCC 6 x 编译的 我们使用的是 GCC 4 8 并且收到以下类型的错误 undefined reference to std cxx11 basic string当尝试链接时 通常
  • PHP 邮件停止工作

    前几天使用的时候mail 我让它工作了 但现在不行了 而且我不知道问题是什么 to email protected cdn cgi l email protection subject the subject message hello h
  • 如何获取 JSON 对象数组中所有子节点的 JSONPath?

    如何获取对象所有子节点的 JSONPath E g var data key1 children key2 value key3 value key4 key2 value key3 value key4 key5 value key1 c
  • 使用 numpy 处理 exp 溢出

    使用 numpy 我有一个函数的定义 def powellBadlyScaled X f1 10 4 X 0 X 1 1 f2 numpy exp numpy float X 0 numpy exp numpy float X 1 1 00
  • 检查文件是否存在(由命令行参数给出)

    我需要一个使用unix环境的C程序 我已经购买了 Unix环境下的高级编程 一书 到目前为止它已经帮了我很大的忙 然而 我的一些问题没有得到解答 我正在寻求一些帮助 我正在尝试编写一个程序 可以验证是否存在复制程序时输入的第一个和第二个参数
  • readstream 管道未关闭

    我正在使用 sax js 读取大型 xml 文件 解析器完成后我无法让程序退出 这是脚本的形状 删除了解析器逻辑 var fs require fs var sax require sax var feedFile foo xml var
  • Google Cloud Endpoints 链接 iOS 客户端问题

    这个问题的产生是因为我不完全理解iOS中的静态库 而且谷歌的文档似乎有点稀疏 我正在尝试将 Google Cloud Endpoints 用于我的移动后端 我为我的客户端库生成 m 和 h 文件 然后我创建了一个新项目 OwnItApi 将
  • 将 fscanf 转换为 C 中的二维数组

    我想将 txt 中的元素扫描到数组中 txt 没有我将有多少行或列 它只包含一个坐标和数组的元素 它看起来像这样 2 3 2 1 3 0 我怎样才能将这些数字放入一个数组中 以便array 0 0 将2 and array 1 0 将3 e
  • 在 Crypto++ 中使用原始 RSA 算法加密和解密消息?

    我在用Crypto http git github com weidai11 cryptopp git密码学相关作品的图书馆 任务的子部分是加密和解密文本 该消息的长度最多为 256 个字符 包含字母数字 空格 点和特殊字符 这段代码适用于
  • WPF - 使用视频作为背景

    我想知道是否可以在 WPF 中使用视频作为背景 我的意思是 我希望在后台播放视频 并在其顶部添加控件 如果你还是不太明白我的意思 你应该看看这个网站 http www barrelny com recap 2012 http www bar
  • Laravel 数据透视表具有多列,需要稍后插入

    我有两张桌子routes and stations和一个数据透视表route station 详见表格 路线表 id number code 车站表 id name code 路线站表 枢轴 id route id station id n
  • 如何解析javadoc? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 Java 阅读 javadocs 我的java对象有属性 描述 包裹名字 方法名称 方法描
  • 回显 jpassword 字符一次然后隐藏它

    在我的 swing 应用程序中 我想回显 jpassword 字段字符一段时间 1 秒 然后再次隐藏它 我想在用户输入字符后逐个字符地执行此操作 当用户输入字符时 显示它 然后隐藏它 然后对于所有输入字符重复此操作 有人可以告诉我这是否可能
  • XSLT 运行速度太慢

    我有大约 100 个 XML 文件 我想将它们转换为另一个具有更好结构的文件 本示例将其转换为 CSV 但我还有一个变体 可以将其转换为更好的 XML 格式与我无关 我看到有很多这样的问题 但我发现这些例子很难适应 因为问题不是样式表不起作
  • 在 Flutter 中,如何在本机文件资源管理器中为用户打开文件夹,以便用户可以浏览其文件/文件夹

    我正在 flutter 中构建一个文件储物柜应用程序 它可以锁定文件和文件夹 当用户解锁文件夹时 我希望我的应用程序显示一个在本机文件资源管理器中查看文件夹内容的选项 有什么办法可以实现这个功能吗 提前致谢 您可以针对您提到的用例尝试此包
  • 在具有特定约束的滚动视图中显示图像(使用自动布局)

    我想在视图控制器中显示标题和图像下方 我的限制是 标签可以位于屏幕顶部 50 像素处 标签可以有一行或多行 图像可以位于我的标签的 50 像素处 图像必须具有屏幕的宽度 滚动视图必须根据所有这些元素的大小进行滚动 我有一个带有滚动视图的视图