使用自动布局检索子视图的正确位置

2024-01-01

我想以编程方式将视图放置在故事板中创建的所有子视图的中心。

在故事板中,我有一个视图,在一个垂直 StackView 内部,它具有填充全屏的约束,分布“等间距”。 在垂直堆栈视图内部,我有 3 个水平堆栈视图,约束高度 = 100,超级视图的尾随和前导空格:0。分布也是“等间距”。 在每个水平堆栈视图中,我有两个视图,约束宽度和高度 = 100,视图为红色。

So far, so good, I have the interface I wanted, enter image description here

现在我想检索每个红色视图的中心,在该位置放置另一个视图(事实上,它将是棋盘上的棋子......)

所以我写道:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var verticalStackView:UIStackView?

override func viewDidLoad() {
    super.viewDidLoad()
    print ("viewDidLoad")
    printPos()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print ("viewWillAppear")
    printPos()
}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    print ("viewWillLayoutSubviews")
    printPos()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print ("viewDidLayoutSubviews")
    printPos()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print ("viewDidAppear")
    printPos()
    addViews()
}


func printPos() {
    guard let verticalSV = verticalStackView else { return }
    for horizontalSV in verticalSV.subviews {
        for view in horizontalSV.subviews {
            let center = view.convert(view.center, to:nil)
            print(" - \(center)")
        }
    }
}

func addViews() {
    guard let verticalSV = verticalStackView else { return }
    for horizontalSV in verticalSV.subviews {
        for redView in horizontalSV.subviews {
            let redCenter = redView.convert(redView.center, to:self.view)
            let newView = UIView(frame: CGRect(x:0, y:0, width:50, height:50))
            //newView.center = redCenter
            newView.center.x = 35 + redCenter.x / 2
            newView.center.y = redCenter.y
            newView.backgroundColor = .black
            self.view.addSubview(newView)
        }
    }
}

}

这样,我可以看到在 ViewDidLoad 和 ViewWillAppear 中,指标是故事板的指标。然后,位置在 viewWillLayoutSubviews、viewDidLayoutSubviews 和 viewDidAppear 中发生变化。

在 viewDidAppear 之后(所以在所有视图都就位之后),我必须将 x 坐标除以 2 并添加类似 35 的值(参见代码)以使新的黑色视图正确居中于红色视图的中心。我不明白为什么我不能简单地使用红色视图的中心......为什么它适用于 y 位置?


我发现你的问题,更换

let redCenter = redView.convert(redView.center, to:self.view)

with

let redCenter = horizontalSV.convert(redView.center, to: self.view)

转换的时候,要从视图原始坐标进行转换,这里是horizo​​ntalSv

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

使用自动布局检索子视图的正确位置 的相关文章

  • 我如何从子视图导航到 mainviewcontroller

    我刚刚开始使用 swift 我创建了一个子视图 上面有一个按钮 我想使用该按钮将我带到我的主视图控制器 我对不同的按钮使用了相同的功能 但是在同一文件中具有一个功能允许该按钮工作 代码如下 var playAgainButton UIBut
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • 本地化现有的 iOS 应用程序

    我不敢相信以前没有人问过这个问题 要么是我的编码实践太无组织性 要么是我没有使用正确的关键字 How can I localize an existing iOS app that does not use NSLocalizedStrin
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • Swift:使具有相同“形状”的两种类型符合通用协议

    我有两种不同的类型 它们代表相同的数据 并且具有完全相同的 形状 这两种不同的类型是代码生成的 我被迫处理它们 但是 我想让它们符合一个通用的协议 这样我就可以对这两种类型一视同仁 这是一个例子 假设这是我所坚持的两种代码生成类型 stru
  • AVAssetExportSession 为零 iPhone 7 - Plus 模拟器

    AVAssetExportSession在 iPhone 6 及以下版本上运行良好 但在 iPhone 7 iPhone 7 Plus 模拟器上运行不佳 Xcode 8 0 这段代码return nil在exportSession中 当在i
  • 根据 iOS 版本使用不同的类实现?

    iOS 11 最近添加了一个我想使用的新功能 但我仍然需要支持旧版本的 iOS 有没有一种方法可以将同一个类编写两次 并让较新版本的 iOS 使用该类的一个版本 而旧版本的 iOS 使用另一个版本 注 最初我用的是if available
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf
  • iOS - UITableViewCell 使文本加粗

    我有一个字符串 NSString userInfo James Johnson james 我想做的就是大胆James Johnson并保留 james正常字体 所以我尝试过的是使用NSAttributedString但为了完成这个过程 我

随机推荐

  • 如何在预定时间运行 PHP 脚本

    我需要每天在预定时间运行 php 脚本来更新数据库中的一些字段并发送自动电子邮件 我怎样才能做到这一点 是否可以在 XAMP 服务器中编写一些服务以每天在预定时间运行脚本 我不知道如何更新数据库并在预定时间自动发送电子邮件 任何人都可以分享
  • gayi 未定义 - Google 登录问题与gapi.auth2.init

    我正在尝试实施 Google Sign In 并检索用户的个人资料信息 错误是 Uncaught ReferenceError gapi未定义 这是为什么
  • KnockoutJS 选择选项和选定值

    类似的问题如 选择元素的初始值 https stackoverflow com questions 7516089 knockoutjs select initial value 我在设置选择元素的初始值时遇到问题 我基本上有一个从服务器传
  • 为什么我们在使用 JSF Web 应用程序时需要 beans.xml?

    在学习了一段时间 JSP 和 Servlet 之后 我开始使用 JSF 进行 Web 开发 当您创建 JSF Web 应用程序时 您总是 可能经常 但我不确定是否总是 必须创建 beans xml 并且您不需要在其中编写任何内容 但是 如果
  • php 文件上传错误 1 ​​- 使用 php_ini 的正确方法是什么?

    我在将 pdf 上传到服务器时遇到问题 upload max filesize 为 2M 文件大于此值 约为 4M 我在这里发现了一个与我的问题类似的帖子 即使 upload max size 大于文件大小 FILE 上传大文件也会出现错误
  • 如何远程关闭 Java RMI 服务器

    我有一个非常简单的 Java RMI 服务器 如下所示 import java rmi import java rmi server public class CalculatorImpl extends UnicastRemoteObje
  • C++ 算术提升标头的用途

    我一直在使用一组模板来确定 C 中给定两种基本类型的正确提升类型 这个想法是 如果您定义自定义数字模板 您可以使用它们来确定返回类型 例如基于传递给模板的类的operator 函数 例如 Custom numeric class templ
  • 如何创建多维数组?

    我想创建具有级别 组和项目的多维数组 为什么不创建自定义对象的数组 class A int t int b List a test new ArrayList a test add new A a a
  • 理解 phpcurl_multi_exec

    我试图理解curl multi exec 我在这里复制了一部分手动示例 所以我想知道它是如何工作的 我猜第一个循环发送http请求 但随后是一个循环内的循环 使用带有看似未记录的标志的函数 我想并行下载 70 个网址 http www ph
  • 何时使用函数式 setState

    在过去的几天里 我一直在学习 React 查看了一些关于编写不同元素的不同方式的教程和解释 不过 有一个我一直很好奇的 setState更新 覆盖函数state组件的属性 例如 假设我有一个包含以下内容的课程 class Photos ex
  • RxJs switchMap 与 Angular HttpClient

    我有一个用例 每当触发新请求时 任何已经在进行中的 http 请求都应该被取消 忽略 For eg 当请求 1 响应时间太长 网络连接速度变慢时 会出现请求 例如 2 在这种情况下 2 从服务器获得非常快的响应 即使 1 返回 HTTP 响
  • 如何以 REST方式返回随机项?

    我的设计公开了两种资源 Images Tags 我希望客户能够通过他们的标签请求随机图像 例如 给我标记有 纽约 和 冬天 的随机图像 在这种情况下 RESTful 设计会是什么样子 为了总结评论中的所有讨论 并且不改变我最初的建议 这就是
  • php静态方法问题

    这两段代码有什么区别 class something static function doit echo hello world something doit 和相同但没有 static 关键字 class something functi
  • 如何设置网格视图列的高度?

    我是flutter新手 没有太多经验 我正在尝试使用 flutter 开发一个 android 应用程序 这是我以前的应用程序设计 我还能够成功地在颤动中制作网格视图 但列高是问题所在 他们中的任何人都可以帮助我解决我的颤振代码吗 clas
  • Hadoop 2.4.1 和适用于 Hadoop 的 Google Cloud Storage 连接器

    我正在尝试使用 Google 的 Cloud Storage Connector for Hadoop 在 Hadoop 上运行 Oryx https cloud google com hadoop google cloud storage
  • 如何通过jquery隐藏没有id/class的div?

    如何使用 jQuery 隐藏第一个 第二个 div Div 无法获取 id class div p ssssssss p div div p ttttttttt gt p div div p fffff p div 隐藏第一个 div 元素
  • Form1_KeyDown 不起作用

    private void Form1 KeyDown object sender KeyEventArgs e if listBox1 Items Contains e KeyCode listBox1 Items Remove e Key
  • 在 C++ 中添加双精度数和复数

    考虑一下这段代码 include
  • 通过使用网格视图中的图像按钮在代码隐藏中调用函数

    我有一个ImageButton在一个GridView在 aspx 上clicking this ImageButton我必须调用一个函数 这就是我尝试的方法 但该函数没有被调用 aspx页面内的代码
  • 使用自动布局检索子视图的正确位置

    我想以编程方式将视图放置在故事板中创建的所有子视图的中心 在故事板中 我有一个视图 在一个垂直 StackView 内部 它具有填充全屏的约束 分布 等间距 在垂直堆栈视图内部 我有 3 个水平堆栈视图 约束高度 100 超级视图的尾随和前