textView换行切换居中显示

自定义个textView,重写下面2个func
外部调用只需要改变textView对应行的高度即可

//换行的时候会调用,而且多次,虽然也会调用setContentOffset,但是最后还是调用它
public override var contentOffset: CGPoint {
    didSet {
        if isContainChangecontentOffsetY {
            if contentOffsetCallBack != nil {
                super.contentOffset = contentOffsetCallBack!(contentOffset)
            }
            else {
                let h = frame.size.height
                //行高
                let lineHeight = font?.lineHeight ?? 17
                //行数
//                    let lineCount = Int((contentSize.height - textContainerInset.top - textContainerInset.bottom) / lineHeight)
                
//                    print(contentSize.height - h > lineHeight)
                
                var offset = contentOffset
                /* 1.当小于最大行数的时候,让textView内容居中显示,
                 偏移量就为(contentSize.height - h) / 2
                 2.大于最大行数,让textView底部稍微空出一点
                 偏移量contentSize.height - h + 2
                 */
                //contentSize.height - h > lineHeight(内容 - 高度 大于 1行的高度说明超过了最大的行数)
                //lineCount <= maxLineCount
                offset.y = contentSize.height - h < lineHeight ? (contentSize.height - h) / 2 : contentSize.height - h + 2
                super.contentOffset = offset
            }
        }
        else {
            super.contentOffset = contentOffset
        }
    }
}

//当行数超过最大的行数的时候,每次改变输入的内容读会调用这个func,这个可不写
public override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: animated)

你可能感兴趣的:(textView换行切换居中显示)