获取自定义控件的固有高度

Posted

技术标签:

【中文标题】获取自定义控件的固有高度【英文标题】:Get the intrinsic height of a custom control 【发布时间】:2016-10-16 00:29:01 【问题描述】:

如何获取自定义控件的高度?

这个想法是我将使用它来动态设置自定义控件内一些按钮的高度。我在 Xcode 大小检查器中将占位符高度设置为 44。

根据 Apple 的 Start Developing ios Apps (Swift) 教程,我正在尝试访问 frame.size.height,它给出的值是 1000,而教程似乎建议它应该是 44。

class RatingControl: UIView 
    ...
    override public var intrinsicContentSize: CGSize 
        let buttonSize = Int(frame.size.height)
        print(buttonSize) // prints 1000
        let width = (buttonSize * starCount) + (spacing * (starCount - 1))
        return CGSize(width: width, height: buttonSize)        
    
    ...

【问题讨论】:

【参考方案1】:

您不应该在intrinsicContentSize 中访问frameintrinsicContentSize 应该返回完全适合视图内容的大小,无论其当前帧如何。

在您的情况下,我认为您可以将 44 用于您的 buttonSize

【讨论】:

Apple 的作者在他们的教程中以这种方式访问​​了frame,这很奇怪。将大小设置为 44 有效。我就随它去吧。【参考方案2】:

占位符的固有大小就是占位符,因此 IB 解释器具有一些使用价值,并且可以布局场景的其余部分。但是在您的intrinsicContentSize getter 中,您实现了实际大小,AutoLayout 引擎将在运行时使用该大小。由于您返回 1000 作为内在内容高度,这就是您将在运行时看到的。

【讨论】:

1000 是从哪里来的,我怎样才能得到 44,因为它是在自定义控件的 height 属性上设置的?我想做类似let buttonSize = /* wherever 44 is */ 在您的 intrinsicContentSize 实现中,您返回 1000。您自己在评论 // prints 1000 中这么说。 自动布局可以使用任何值作为视图的初始大小。它曾经使用来自 IB (interface builder) 的值,但从 iOS 10 开始,一切似乎都是 1000。 1000 来自布局前的解码器。占位符值在解码期间无论如何都不会到达。 @ThisClark 在此处查看我的答案:***.com/questions/22533418/… 这将帮助您入门。

以上是关于获取自定义控件的固有高度的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义控件——IndicatorLayout

iOS 根据字符串数目,自定义Label等控件的高度

iOS 根据字符串数目,自定义Label等控件的高度

Qt编写自定义控件53-自定义宽高下拉框

android自定义控件的最大高度MaxHeightView

Android的FixScrollView自定义控件