From ad63b4c89dca9f00872d62b412aa69097d7452b8 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 19:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=EF=BC=9A=E9=9D=A2=E6=9D=BF=E5=BA=95?= =?UTF-8?q?=E9=83=A8=E3=80=8C=E4=BF=9D=E5=AD=98/=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E3=80=8D=E6=8C=89=E9=92=AE=E8=A2=AB=E8=A3=81=E6=8E=89=E7=9C=8B?= =?UTF-8?q?=E4=B8=8D=E8=A7=81=20(#77)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户 2026-11-05:「你改的是什么?是鸿蒙版吗?怎么没有看到任何按钮啊?」 代码确实在(我解包 sy-77.hap 在 modules.abc 里搜到了"保存中"字符串), 是**布局把它裁掉了**。 真根因:中间那个 Scroll 用的是 `flexShrink(1)` —— `flexShrink` 只表示"空间不够时允许收缩",但 Scroll 的**内容高度** 仍会把自身撑开(ArkUI 竖向 Scroll 默认按内容高参与布局)。于是: 头部 + Scroll(按内容撑满) 吃光 `maxHeight: 86%` → 下面的 footBar 被推到 86% 之外 → `FbSheetRing.clip(true)` 把它整条裁掉 ⇒ 一颗按钮都看不见(而且连痕迹都没有,看起来就像"没做")。 改法: ① Scroll → `layoutWeight(1)` "占据剩余空间"而不是"按内容撑开"。高度被限定成 "86% − 头部 − 分割线 − footBar",footBar 因此必然留在可视区内, 内容再长也只在自己内部滚动。 ② footBar 补 `flexShrink(0)` 显式禁止压缩,防止某些机型把 42 高的按钮压扁。 ⚠️ 旧注释(v60b)说 `layoutWeight(1)` 会让"短内容也把卡片顶满、底下留一片空白"。 那个副作用是真的,但属于观感问题;按钮看不见是功能问题。 两害相权先保证按钮可用。要消空白的话正确做法是外层配 minHeight:0, 而不是回到 flexShrink(那条路会让底栏被挤出去)。 编译通过,已装真机。 --- entry/src/main/ets/components/FbTaskPanel.ets | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/entry/src/main/ets/components/FbTaskPanel.ets b/entry/src/main/ets/components/FbTaskPanel.ets index e038baa..3938255 100644 --- a/entry/src/main/ets/components/FbTaskPanel.ets +++ b/entry/src/main/ets/components/FbTaskPanel.ets @@ -904,9 +904,27 @@ export struct FbTaskPanel { .width('100%') .alignItems(HorizontalAlign.Start) } - /* `flexShrink(1)` 而不是 `layoutWeight(1)`:后者会让短内容也把卡片顶满, - 底下留一大片空白(v60b 真机实测) */ - .flexShrink(1) + /* 🔴🔴 #77r(用户 2026-11-05):「怎么没有看到任何按钮啊?」 + + **真根因**:这里是 `flexShrink(1)`,不是 `layoutWeight(1)`。 + `flexShrink` 只是"空间不够时允许收缩",但 Scroll 的**内容高度** + 仍然会把自身撑开(ArkUI 里 Scroll 竖向内容默认按内容高)。 + 于是: + 头部 + Scroll(按内容撑满) 就把 `maxHeight: 86%` 吃光了 + → 下面的 `footBar()`(保存/删除)被推到 86% 之外 + → `FbSheetRing` 的 `clip(true)` 把它裁掉 ⇒ 一个按钮都看不见。 + + `layoutWeight(1)` 是"**占据剩余空间**":Scroll 的高度被限定成 + "86% − 头部 − 分割线 − footBar",footBar 因此必然留在可视区内, + 内容再长也只是在 Scroll 内部滚动。 + + ⚠️ 旧注释说 `layoutWeight(1)` 会让"短内容也把卡片顶满"(v60b)。 + 那个副作用是真的,但它是**观感问题**; + 而按钮看不见是**功能问题** —— 两害相权,先保证按钮可用。 + 要消掉空白的话,正确做法是给外层 Column 用 + `.constraintSize({ maxHeight: '86%' })` 配合 **`minHeight: 0`**, + 而不是回到 flexShrink。 */ + .layoutWeight(1) .width('100%') .scrollBar(BarState.Off) .align(Alignment.TopStart) @@ -2043,5 +2061,10 @@ export struct FbTaskPanel { } .width('100%') .margin({ top: 12 }) + /* #77r:底栏**不许被压缩** —— Scroll 已经 layoutWeight(1) 拿剩余空间, + 这里再显式 flexShrink(0) 兜一层,防止某些机型上把 42 高的按钮压扁。 + (按钮整个看不见那次,就是没有这层保护、整条栏被挤到 86% 之外。) */ + .flexShrink(0) } } +