# ArkUI布局开发常见问题(ArkTS)


## 使用position之后height不生效(API 9)

**解决措施**

容器组件在使用position之后会脱离文本流,导致容器脱离外层容器束缚,导致height不生效,可以将外层容器换成Stack可以解决这个问题。


## Grid组件如何实现横向滚动(API 9)

将Grid组件设置当前网格布局行数rowsTemplate且不设置列数,当内容超出Grid组件宽度时,Grid可横向滚动进行内容展示。


## List组件与其他组件并列使用时,若未设置List滚动方向上的尺寸,无法拖动到底部(API 9)

给List加上layoutWeight属性,设置列表自适应占满剩余高度。原理:List属于可滚动容器组件,默认高度是占满全屏幕高度,当出现其他固定高度的组件占领了屏幕的部分高度时,需要开发人员显性的指定List组件占满剩余高度,而不是全屏幕高度。


## Tabs组件在点击Tab项时是否支持禁止切换(API 9)

不支持。


## 如何拦截住onBackPress事件,不触发页面返回(API 9)

在onBackPress中返回true表示页面自己处理返回逻辑,不会执行默认的返回逻辑。

**参考链接**

[自定义组件的生命周期-onBackPress](../reference/apis-arkui/arkui-ts/ts-custom-component-lifecycle.md#onbackpress)


## List组件怎么实现分组列表的粘性标题效果(API 9)

可以通过List组件的sticky属性配合ListItemGroup组件来实现。通过给List组件设置sticky属性为StickyStyle.Header,设置ListItemGroup中header参数对应的头部组件呈现粘性标题效果

**参考链接**

[创建列表-添加粘性标题](../ui/arkts-layout-development-create-list.md#添加粘性标题)

## 键盘弹出时如何只让指定UI组件进行上移,而不是整体布局(API 10)

**解决措施**

 键盘弹出时的避让可以利用安全区域接口expandSafeArea进行UI逻辑避让控制。

**参考链接**

[安全区域](../reference/apis-arkui/arkui-ts/ts-universal-attributes-expand-safe-area.md)

## 有哪些实现图文混排的方式,每种方式的优劣点是什么,推荐场景是什么(API 10)

**解决措施**

1、如果做页面展示,可通过Text嵌套ImageSpan或者容器组件如Row、Colunm下嵌套Text&Image组件,推荐前者;

2、如果要进行编辑,可使用RichEditor控件。

**参考链接**

[图文混排](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md)

## 如何实现协调布局的效果(API 10)

**解决措施**

可滚动类组件可以使用nestedScroll属性设置嵌套滚动。

**参考链接**

[Scroll](../reference/apis-arkui/arkui-ts/ts-container-scroll.md)

## 如何解决sidebar侧边栏出现时,遮挡住下方的导航栏的问题(API 10)

**解决措施**

将被遮挡的导航栏作为SideBarContainer组件的第二个子组件使用,使其成为内容区的一部分,SideBarContainer的侧边栏只会遮挡内容区自身宽度的部分,其余部分可以正常看到。

**参考链接**

[SideBarContainer](../reference/apis-arkui/arkui-ts/ts-container-sidebarcontainer.md)

## 如何解决使用foreach&lazyforeach循环渲染时,会出现更改数据源时,界面不刷新的问题(API 10)

**解决措施**

如果缺省keyGenerator,框架会自动基于item和index生成key, 如果函数缺省,框架默认的键值生成函数为(item: T, index: number) => { return index + '__' + JSON.stringify(item); }, 修改状态变量数据源时,ForEach或LazyForEach会捕捉到key的变化,从而通过重建组件节点来刷新。

**参考链接**

[ForEach:循环渲染](../quick-start/arkts-rendering-control-foreach.md)

## CustomDialog,Popup等弹窗如何与页面解耦,最佳实践是什么样的(API 10)

**解决措施**

弹框类组件需要绑定到对应组件上,由事件触发。对于内容可以使用全局builder,只需定义一次。

全局builder:

定义的语法:

@Builder function MyGlobalBuilderFunction(){ ... }

使用方法:

MyGlobalBuilderFunction()

全局的自定义构建函数可以被整个应用获取。如果不涉及组件状态变化,建议使用全局的自定义构建方法。

**参考链接**

1. [自定义弹窗(CustomDialog)](../reference/apis-arkui/arkui-ts/ts-methods-custom-dialog-box.md)
2. [Popup控制](../reference/apis-arkui/arkui-ts/ts-universal-attributes-popup.md)
3. [@Builder装饰器:自定义构建函数](../quick-start/arkts-builder.md)

## 为什么两个紧挨着的相同颜色的控件之间会有白线、暗线。如何解决(API 11)

**解决措施**

白线、暗线通常是因为相邻的同色控件边界落在了浮点数坐标上,图形层做了抗锯齿处理,视觉上产生了一条白线或暗线。可以通过pixelRound通用属性设置,
使产生白线、暗线两侧的组件边界对齐到整数像素坐标上。

使用方法:
```ts
Flex(){
    Column().height('30%').width('30%').backgroundColor(Color.Blue)
        .pixelRound({end: PixelRoundCalcPolicy.FORCE_CEIL})
    Column().height('30%').width('30%').backgroundColor(Color.Blue)
    Column().height('30%').width('30%').backgroundColor(Color.Blue)
}
```

**参考链接**
[布局约束](../reference/apis-arkui/arkui-ts/ts-universal-attributes-layout-constraints.md)