youngsoft / TangramKit

TangramKit is a powerful iOS UI framework implemented by Swift. It integrates the functions with Android layout,iOS AutoLayout,SizeClass, HTML CSS float and flexbox and bootstrap. So you can use LinearLayout,RelativeLayout,FrameLayout,TableLayout,FlowLayout,FloatLayout,LayoutSizeClass to build your App 自动布局 UIView UITableView UICollectionView
MIT License
1.21k stars 175 forks source link

Layout 内部修改 UILabel 属性是基于什么考虑呢? #22

Closed EkkoG closed 6 years ago

EkkoG commented 6 years ago

https://github.com/youngsoft/TangramKit/blob/74ebd2a287e0edf4887711caacf8b31fda24498e/TangramKit/TGLayoutSize.swift#L574

遇到一个想让一个 UILabel 只是占用剩余空间但是不用换行,才发现 layout 内部修改了 numberOfLines 属性,导致 UILabel 显示多行,想问下这样做是基于什么考虑呢?

youngsoft commented 6 years ago

这是一个好问题,在一些场景中我们希望UILabel在某个固定的宽度下高度能够自适应而换行,所以我们可以按照下面的写法:

 labelView.tg_width.equal(100)
 labelView.tg_height.equal(.wrap)

而要想让UILabel的高度在某个固定宽度下自适应时就必须将numberOfLines的值设置为0。当时的一个纠结的点是否要在设置高度自适应时将numberOfLines的设置权交给使用方还是库里面自己就处理了:

  1. 如果交给使用方那么在设置tg_height.equal(.wrap)后使用方还要明确的设置一下numberOfLines = 0. 这样就增加了使用的成本。
  2. 如果是库内部设置的话,这样就会向使用方隐藏了一些未可知的设置。

所以综合考虑,为了易用性还是选择了后者。其实这个问题也还好理解,如果你想要你的高度自适应而且会换行那么你只要设置明确的宽度和为wrap的高度即可,这时候系统会自动换行;而如果你想让你的高度和宽度也同时自适应时,你可以设置宽度和高度都为wrap,这样即使内部设置了numberOfLines为0也不会有换行的处理;而如果你就想让宽度占用剩余的空间,但是高度不换行那么你就不应该设置高度为.wrap,而是应该明确的指定一个高度值。

EkkoG commented 6 years ago

OK 了解了,不过觉得交给使用方比较直观,有没有设置自己心里清楚,内部修改会导致使用方比较困惑为什么明明没有设置怎么就换行了