【问题标题】:Getting frame of UIBarButtonItem returns nil获取 UIBarButtonItem 的框架返回 nil
【发布时间】:2017-04-27 03:11:23
【问题描述】:

我正在尝试像这样访问UIBarButtonItem 的框架:

if let items = self.toolbarItems{

        let item = items[1]

        print(item)
        let view = item.value(forKey: "view") as! UIView


    }

print(item) 返回一个现有项目。为什么无法找回UIView

【问题讨论】:

  • UIBarButtonItem 不是视图。
  • @rmaddy 这就是我访问 item.value(forKey: "view") 的原因
  • @TusharSharma 这是我使用的示例代码
  • 不,您没有使用上述链接中的代码。它应该看起来像这样:let barButtonItem = self.navigationItem.rightBarButtonItem! let buttonItemView = barButtonItem.value(forKey: "view") as? UIView let buttonItemSize = buttonItemView?.frame.size

标签: ios swift uiview uibarbuttonitem


【解决方案1】:

这就是使用未记录属性的问题。他们可以更改,恕不另行通知。

以下是使用 Xcode 8.3.1 和 iOS 10 SDK 的结果。

let item1 = UIBarButtonItem(customView: UIView())
let view1 = item1.value(forKey: "view") as? UIView
print("\(view1)")

打印

Optional(<UIView: 0x7f9049001400; frame = (0 0; 0 0); layer = <CALayer: 0x60000003cc00>>)

然而

let item2 = UIBarButtonItem(title: "Test", style: .plain, target: nil, action: nil)
let view2 = item2.value(forKey: "view") as? UIView
print("\(view2)")

打印

nil

甚至将其提升到一个新的水平

class MyObject: NSObject { @objc var view: UIView? } // Fake to get selector

let item3 = UIBarButtonItem(title: "Test", style: .plain, target: nil, action: nil)
let view3 = (item3 as NSObjectProtocol).perform(#selector(getter: MyObject.view))?.takeRetainedValue()
print("\(view3)")

打印

nil

【讨论】:

  • 感谢您的解释。但是,您知道在我的情况下如何解决此问题吗?我仍然需要访问框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多