【问题标题】:SWIFT: can't click on subviewSWIFT:无法点击子视图
【发布时间】:2016-02-19 23:46:28
【问题描述】:

我创建新的子视图

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    controller = storyboard.instantiateViewControllerWithIdentifier("menu") as! MenuViewController
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);
    mainView.addSubview(controller.view)
    controller.view.layer.zPosition = 1
    controller.viewDidLoad()

然后我在 viewController 上添加按钮

但是我不能点击按钮...

我可以选择新控制器下的文本(我添加照片)

【问题讨论】:

  • 为什么要设置zPosition? 将其添加为子视图会自动将其置于最前面。
  • 你为什么要手动做所有其他事情?
  • 没有 zPosition 不工作:/

标签: swift uiviewcontroller addsubview


【解决方案1】:

您的代码几乎没有问题。

首先,据我所知,您的代码范围有限,您无需将图层的zPosition 属性设置为默认值零以外的任何值。通过使用addSubview,您正在添加的视图会自动添加到所有当前子视图的顶部。

其次,以编程方式创建框架基本上没有任何问题,但通常这会导致屏幕尺寸不同的设备出现问题。此外,当您将视图的宽度设置为等于另一个视图的宽度时,我建议使用自动布局,它会在宽度发生变化时自动更新。它还允许您创建跨所有设备屏幕尺寸/尺寸类别的响应式界面。

controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);

第三,无需手动触发controller.viewDidLoad(),因为它会在设置框架后自动调用。

第四(!)您将视图的框架设置为隐藏在屏幕顶部之外。我不确定这是正确的功能,但想确保您知道通过将视图的 y 原点设置为等于框架的原点,视图的底部将与位于其 superview 的顶部。

容器视图控制器是包含其他视图控制器的视图控制器,允许您创建更多模块化代码,并将视图分离到托管视图控制器中。应该改用这种模式。

请参阅https://www.objc.io/issues/1-view-controllers/containment-view-controller/ 了解更多信息。

在下面的代码中,我还检查了controller 变量是否为nil,这将防止当您尝试强制解开控制器并且它不属于MenuViewController 类时发生崩溃。可以理解,这有点迂腐,因为您可能确定被实例化的视图控制器是正确的,但安全总比后悔好。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewControllerWithIdentifier("menu") as?  MenuViewController {
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150);
    // Frame may need to be modified to be made visible ^
    addChildViewController(controller)
    controller.willMoveToParentViewController(self)
    mainView.addSubview(controller.view)
    controller.widMoveToParentViewController(self)
}

【讨论】:

  • 一个小问题:viewDidLoad() 在视图加载后被调用,不管视图是否在屏幕上。对controller.view.frame 的调用将导致viewDidLoad() 运行,甚至在controller.view 被添加为子视图之前。
  • @AaronBrager 是的,你是对的!我已经更新了答案。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多