如何从另一个类访问 UIView 的宽度和高度?
Posted
技术标签:
【中文标题】如何从另一个类访问 UIView 的宽度和高度?【英文标题】:How to access width and height of a UIView from another class? 【发布时间】:2019-06-19 22:59:20 【问题描述】:我正在使用 UIPresentationController 制作自定义动画。我正在努力做到这一点,以便当按下按钮转到下一个视图控制器时,呈现的视图控制器占用了前一个视图控制器中一个 UIView 的宽度。我需要帮助的是如何从我的 UIPresentationController 类中访问 UIView 的宽度和高度。
在视图控制器中:
@IBOutlet weak var buttonView: UIView!
func width() -> CGFloat
return buttonView.frame.size.width
func height() -> CGFloat
return buttonView.frame.size.height
在演示控制器中:
override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize
let vc = ViewController()
return CGSize(width: vc.width(), height: vc.height())
我目前遇到的错误是,当我返回 buttonView.frame.size.width 或 buttonView.frame.width 时,它意外返回 nil 作为可选值。但是,宽度不是可选值,如果我打印出来也不会返回 nil。它不允许我访问要在视图控制器范围之外使用的变量。任何帮助表示赞赏。
【问题讨论】:
programmingios.net/dont-make-a-new-instance-by-mistake 【参考方案1】:即使你初始化了视图控制器,按钮的 iboutlet 还没有被初始化。因此,当您调用 width 函数时,您正在访问 nil 以获取非可选属性。加载笔尖时初始化 Iboutlets。
这是从另一个视图控制器访问视图的方法..
call IBOutlet UIButton from one class to another Viewcontroller
【讨论】:
感谢您的回复!那么你需要做什么来加载笔尖呢?那只是在加载视图时吗?另外,初始化是指在实例化 vc 对象时吗?此外,如果这有什么不同,“let vc = ViewController()”代码会在 ViewController 的视图已经加载后调用,因为它正准备转换到下一个视图控制器(与 buttonView 大小相同的视图控制器) Nibs 在调用它们对应的 VC 的 awakeFromNib() 方法时被加载。 “let vc = ViewController()”正在创建 vc 对象的新实例。即使您当前的 ViewController 的视图已加载,您也创建了一个新的 viewController 并使用新实例化的 viewController 来访问未初始化的按钮。 哦,有道理。我查看了您的链接,但我仍然对如何初始化插座感到有些困惑。使用 CAPSPageMenuDelegate 看起来我只能从函数 willMoveToPage() 中的另一个类访问出口。但是,我需要在演示控制器的 func size() 中访问它。您知道仍然能够做到这一点的解决方法吗? 您需要使用演示控制器中的按钮引用 vc。 感谢您的帮助。我想到了。在我的 PresentationController 中,我通过情节提要 id 实例化了视图控制器。然后我访问 vc 中的一个属性,该属性具有一个返回视图宽度的 getter。在 getter 中,我在 return 语句之前有一个 if 语句,检查视图是否已加载,如果未加载,则我使用 loadView() 加载视图。这样,视图的宽度就不会是 nil 值,因为从技术上讲,视图将在幕后加载。【参考方案2】:在 UIPresentationController 的子类中,您可以执行以下操作:
if let myVc = presentingViewController as? MyCustomVc
let myViewWidth = myVc.myCustomView.frame.width
【讨论】:
感谢您的回复。我最终做的是通过 Storyboard ID 在我的 UIPresentationController 子类中实例化 vc(让 vc: ViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as!ViewController)。我认为可选绑定也可以,所以谢谢。以上是关于如何从另一个类访问 UIView 的宽度和高度?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用 SnapKit 使 UIView 具有相等的宽度和高度?
如何将 UIView 的大小调整为特定的高度和宽度,包括其子视图?