iOS 自定义控件自适应大小

如何实现自定义View 具有自动计算size能力

自动计算size能力,简单说就是自动适配大小,只需要满足位置指定,可以不满足内容指定,比如UILable,UIImage等,再混合使用AutoLayout和代码自定义View的时候,经常需要在代码中获取约束布局内容大小,或者需要自定义View具备自动变化大小的能力,即可以根据内容满足约束动态变化,也可以满足自定义View在Xib中布局自动适配。

基本知识点

UIView与内容大小有关的几个属性或方法

对于自定义View 内部大小确定

控件内置大小,一般由内容决定,设置此属性可以约束系统就会拿到它的内容大小, 与frame无关

如果需要改变内在大小,适配自动布局需要重写此属性

intrinsicContentSize

 

使内容大小失效,会调起intrinsicContenSize 计算新的内在大小

func invalidateIntrinsicContentSize()

当需要改变自定义视图大小时,请调用此函数。这允许基于约束的布局系统在更新布局时考虑新的内在内容大小

此函数调用时机:引起内部大小改变的地方,注意不能在layouSubViews中使用,会引起循环

 

相关属性方法调用

引起内容改变的地方调用invlidateIntricContentSize() ,会自动调用重写的intrisicContenSize, instisicContentSize会自动调用布局约束改变layoutSubviews()

 

对于自定义View 外部来说,获取控件大小

调整子视图大小和位置(不能重写)

func sizeToFit()

计算和返回视图合适的尺寸

/// size参数: 给定大小
func sizeThatFits(_ size: CGSize) -> CGSize

sizeTofit简单使用与理解(laughing--简书)

 

实例代码

   
   @objc private func tap(){
        //此处引起内在大小改变为点击事件。
        self.invalidateIntrinsicContentSize()  //先使内置大小无效,自动调用重写内置大小。
        // 改变的数据
        extentSize = CGSize(width: 0, height: 20)
    }
    // 重写改变内置大小
    override var intrinsicContentSize: CGSize{
        // 返回新大小
        return CGSize(width: bounds.width, height: bounds.height+extentSize.height)
    }

 

使用实例:只有20%的iOS程序员能看懂(自定义控件的随内容变换而自适应大小)

 

 

返回最佳的大小,基于当前的约束

// targetSize: layoutFittingCompressedSize(尽可能小) layoutFittingExpandedSize(尽可能大)
func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize
/// targetSize: 目标大小 如果需要尽可能小 使用layoutFittingCompressedSize, layoutFittingCompressedSize(尽可能大)
/// horizontalFittingPriority: 水平约束的优先级。指定fittingSizeLevel以获得尽可能接近targetSize宽度值的宽度
/// verticalFittingPriority: 垂直约束的优先级。指定fittingSizeLevel以获得尽可能接近targetSize高度值的高度
func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize

该方法为视图返回一个size值,该值最优地满足视图的当前约束,并且尽可能接近targetSize参数中的值。这个方法实际上并不改变视图的大小。

你可能感兴趣的:(iOS 自定义控件自适应大小)