最近刚刚开始 IOS 开发,使用的是 Swift (非 swiftUI)开发,发现了一个问题,困扰了我,希望有大佬可以解答

2021-01-15 18:22:12 +08:00
 Xcution
我发现很多地方都要固定写死控件的高度,宽度?难道没有自适应的方式嘛?

我在网上搜了用 SnapKit 的方式可以不设置控件的高宽来使用,这个算是一种方式,但是用了这个方式之后,获取控件的高宽有时候为 0,好像是因为 snapKit 是异步的原因,太痛苦了,有时候就是需要高宽但是获取不到

然后还有个问题就是控件的高宽根据内容自适应,我感觉这个是最头痛的,上面的 snapkit 是和父布局的高宽拉伸,但是有时候我想根据子控件内容自动适应高宽怎么弄呀

这段时间一直在弄控件宽度高度的问题,太痛苦了,因为以前是安卓开发,安卓确实没这么麻烦,如果真的只能这样的话安卓其他不说至少在这方面还是要方便点的,我想我应该是哪里没弄对,是否有大佬解答一下,或者有相关的资料也行,我感觉我这样开发的,问题太多了
7446 次点击
所在节点    iDev
40 条回复
gdtdpt
2021-01-15 18:25:18 +08:00
不是专业 App 开发,只是搞过一阵子,我记得 iOS 的默认布局方式就是安卓里的约束布局,只要设置元素自身的约束、元素与元素之间的约束、元素与父元素的约束就能自适应了。
linKnowEasy
2021-01-15 18:25:48 +08:00
搜一下 SnapKit 自适应 + 你要自适应的控件.
timelessg
2021-01-15 18:30:30 +08:00
本质还是 autolayout 的问题,首先子 view 需要有 contentsize,也就是子 view 要先把自己撑起来,其次各个子 view 之间的约束要设对,这样才会撑起来父 view
Xcution
2021-01-15 18:31:33 +08:00
@gdtdpt 但是我用的代码进行布局的,不知道怎么弄,网上搜了也没搜到相关的资料
@linKnowEasy 我去搜搜看
Xcution
2021-01-15 18:32:13 +08:00
@timelessg 有相关的资料可以看嘛
finab
2021-01-15 18:33:33 +08:00
布局应该不需要确切的 高度,可以把你要的布局说一说
linKnowEasy
2021-01-15 18:37:16 +08:00
搜下 SnapKit 教程 https://www.jianshu.com/p/332b816cd3e4

这个概念其实就是 View 没有固定大小. 都是相对 superview 或者同级的 View
cincout
2021-01-15 18:47:23 +08:00
给你打了一堆字,然后发现我并不擅长给别人讲解。。。还是给你个思路吧,其实很简单,想要自适应内容的高度,你得让内容的上下约束都固定在 contentView 上,且保证内容自身有高度,如果是多行 UIlabel,得保证 UIlabel 有固定宽度。
imkerberos
2021-01-15 18:48:38 +08:00
FlexBox, 你值得拥有。
everhere
2021-01-15 19:08:30 +08:00
snapkit 可以设置宽高,比如
make.width.equalTo
make.height.equalTo
Building
2021-01-15 19:15:10 +08:00
你就没有想过 Android 虽然不用写高度,那高度怎么来的?肯定还是要算的啊,子视图没有高度,那么肯定有一个高度确定的父容器,然后通过约束计算得出子视图的高度。
ooops
2021-01-15 20:13:07 +08:00
把个 AutoLayout 的教程系统的看一下吧,现在这么问没法回答。
yikuo
2021-01-15 21:19:56 +08:00
这其实跟 snapkit 没关系,iOS 的 autolayout 布局方式就是这样的。有的地方可以使用 UIStackView 来简化约束。至于获取不到宽高,是因为你获取的时候 UI 还没计算出真正的大小,这里有两个选择:只用约束不要手动设置宽高,或者在 layoutsubview 之后再获取宽高。我个人觉得 Android 的布局比 iOS 简单很多,Android 有多种布局方式组合使用,可以专心布局,而 iOS 就只有 frame 和 autolayout 以及 UIStackView 了,需要耗费很多精力在调整位置和大小上面。
StyxS
2021-01-15 21:35:30 +08:00
优先级和抗伸缩性
ydatong
2021-01-15 22:08:05 +08:00
可以看看 uistackview,一般的布局能省不少事
Baymaxbowen
2021-01-15 23:15:49 +08:00
equal to superview offset
coloz
2021-01-15 23:17:45 +08:00
为什么不选择跨平台的开发方式呢,搞两套 app 太累了
vincentxue
2021-01-15 23:20:21 +08:00
不是你没弄对,而是 iOS 的布局系统以及它的命令式 UI 开发体验跟 Android 比简直就是一坨屎,更别提和 Web 比了。

iOS 的 Auto Layout 基本上等同于 Android 中的 ConstraintLayout,都是基于约束的布局系统。最大的不同点在于 iOS 中控件的尺寸基本上除了 UILabel / UITextView (相当于 Android 中的 TextView )、UIButton (相当于 Android 中的 *Button )、UIImageView (相当于 Android 中的 ImageView )之类有内容的控件还有一些系统固定尺寸的控件(如 UISegmentedControl 、UISearchBar 等)外,都是没有默认尺寸的。它们的尺寸是基于约束计算出来的。

如果你在 Android 中用过 Google 的 FlexboxLayout,在 iOS 上推荐你用 https://github.com/layoutBox/FlexLayout 这个库。 它是基于 Facebook 开源的 Flexbox 布局引擎 Yoga 实现的,非常好用。百分百找回 Android 上的感觉。iOS 中有个叫 UIStackView 的控件实现了一些类似于 Flexbox 的控件组织方式,但是和真正的 Flexbox 还是差的太远了。

但是说到底,iOS 最好还是要用 Auto Layout 来布局,因为这个才是最 Native 的布局方式。你用其他的布局方式之前,至少要搞投 Auto Layout 。

你有兴趣的话可以加我的 tg 我给你解答,移动端是我的老本行,搞了十来年了,大家互相学习。
oko
2021-01-15 23:28:17 +08:00
自动布局老心酸了,早已放弃,改用手动布局了,虽然烦了一点,但是手动控制每一个像素的感觉还是很美妙的
Sixi
2021-01-16 00:20:54 +08:00
楼主的意思我懂,以前也是从这些坑里慢慢爬出来的。
假如使用 SnapKit 为一个 View 添加约束之后,想要获取这个 View 的 宽高(实际上也就是 frame 值),但总是是 0 。这是因为你获取宽高的代码在你的 SnapKit 代码前执行,此时 View 并没有布局,默认的 frame 值均是 0,所以获取不到的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745335

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX