Personalize a barra de navegação na parte superior do miniaplicativo WeChat

Como personalizar a NavigationBar?

Remova a barra de navegação nativa.

  1. Page.json navigationBar precisará personalizar as páginas de navigationBarTitleText removidas.
  2. Adicione "navigationStyle": "custom" , para que a barra de navegação nativa desapareça e até mesmo o botão de voltar não pareça ser personalizado.
  3. Além disso, já em 2016, o WeChat começou a se adaptar à barra de status imersiva. Atualmente, quase todos os modelos do WeChat são barras de status imersivas, o que significa que, embora a barra de navegação nativa seja removida, toda a tela se tornou um programa programável área .
  4. Documento: https://developers.weixin.qq.com/miniprogram/dev/extended/weui/navigation.html

Calcule navigationBarHeight.

  • O botão de cápsula nativo certamente existe, portanto, a próxima etapa requer que você localize a altura e a posição da barra de navegação personalizada.
  • Para diferentes modelos, para diferentes sistemas, a posição da barra de status e do botão cápsula são incertos, portanto, alguns cálculos são necessários, para que possa ser determinado com calma para qualquer modelo.
  1. Use wx.getSystemInfo () para obter o statusBarHeight , que determina a distância mais básica da barra de navegação dos dados na parte superior da tela.
  2. Use wx.getMenuButtonBoundingClientRect () para obter as informações da cápsula do miniaplicativo (observe que há vários problemas com esta API e o desempenho é inconsistente em diferentes extremidades. O tratamento dessa falha de chamada da API será descrito mais tarde), conforme mostrado em Na figura abaixo, as seguintes informações de coordenadas estão no canto superior esquerdo da tela como a origem.


3. Veja a figura a seguir como exemplo. A caixa vermelha acima é statusBar e a altura é conhecida; a caixa vermelha abaixo é o conteúdo do texto e a do meio é a navigationBarHeight ; e a amarela é o botão nativo da cápsula está também na posição central vertical, a altura é Desde as informações de coordenadas do botão cápsula é conhecida baseada no canto superior esquerdo, não é difícil tirar navigationBarHeight = altura da caixa azul × 2 + cápsula button.height. (Altura da caixa azul = cápsula button.top- statusBarHeight )


 

4. A fórmula de cálculo final é: navigationBarHeight = (capsule button.top- statusBarHeight ) × 2 + capsule button.height. NavigationBar distância da parte superior da tela é o navigationBarHeight .

5. Este método de cálculo é aplicável a vários modelos e iOS Android.

6. Para os raros casos em que " wx.getMenuButtonBoundingClientRect () " obtém um erro ou os dados de obtenção são 0, ele só pode ser simulado. Para android, o navigationBarHeight é geralmente 48 px, e para ios, geralmente é de 40 px. A altura do botão cápsula de todos os modelos é O autor também obteve 32px por meio de muitos artigos e autotestes na Internet, e esse erro geralmente pode ser ignorado. Claro, o ideal é que o WeChat possa conter todos os modelos, ha ha. Por fim, gostaria de lembrar que apenas a máquina real é o padrão, e existem mais bugs nas ferramentas de desenvolvedor.

 

Código

  • Obtenha as informações locais, geralmente escritas no onLaunch do aplicativo.

 App.js

// App.js
...
onLaunch(){
    const { statusBarHeight, platform } = wx.getSystemInfoSync()
    const { top, height } = wx.getMenuButtonBoundingClientRect()

    // 状态栏高度
    wx.setStorageSync('statusBarHeight', statusBarHeight)
    // 胶囊按钮高度 一般是32 如果获取不到就使用32
    wx.setStorageSync('menuButtonHeight', height ? height : 32)
    
    // 判断胶囊按钮信息是否成功获取
    if (top && top !== 0 && height && height !== 0) {
        const navigationBarHeight = (top - statusBarHeight) * 2 + height
        // 导航栏高度
        wx.setStorageSync('navigationBarHeight', navigationBarHeight)
    } else {
        wx.setStorageSync(
          'navigationBarHeight',
          platform === 'android' ? 48 : 40
        )
    }
}
...
  • O autor armazena essas informações de altura no stroage e, em seguida, cria um componente personalizado de navigationBar, e esses dados serão usados ​​no componente.

NavigationBar.js

// navigationBar.js
...
data: {
    // 状态栏高度
    statusBarHeight: wx.getStorageSync('statusBarHeight') + 'px',
    // 导航栏高度
    navigationBarHeight: wx.getStorageSync('navigationBarHeight') + 'px',
    // 胶囊按钮高度
    menuButtonHeight: wx.getStorageSync('menuButtonHeight') + 'px',
    // 导航栏和状态栏高度
    navigationBarAndStatusBarHeight:
      wx.getStorageSync('statusBarHeight') +
      wx.getStorageSync('navigationBarHeight') +
      'px'
}
...
  • O layout em navigationBar.wxml não entrará em detalhes. De modo geral, a barra de navegação usa posicionamento fixo e o botão de retorno personalizado é posicionado verticalmente na linha, o título de navegação é centralizado e as reticências são exibidas quando o número de palavras é demais.

NavigationBar.wxml

<!--navigationBar.wxml-->
<view class="navigation-container" style="{
   
   {'height: ' + navigationBarAndStatusBarHeight}}">
    <!--空白来占位状态栏-->
    <view style="{
   
   {'height: ' + statusBarHeight}}"></view>
    <!--自定义导航栏-->
    <view class="navigation-bar" style="{
   
   {'height:' + navigationBarHeight}}">
        <view class="navigation-buttons" style="{
   
   {'height:' + menuButtonHeight}}">
            <image class="nav-img" src='/images/back.svg'/>
            ...其余自定义button
        </view> 
        <view class="navigation-title" style="{
   
   {'line-height:' + navigationBarHeight}}">{
   
   {title}}</view>
    </view>    
</view>
<!--空白占位fixed空出的位置-->
<view style="{
   
   {'height: ' + navigationBarAndStatusBarHeight}}; background: #ffffff"></view>

NavigationBar.wxss

/* navigationBar.wxss */
.navigation-container {
  position: fixed;
  width: 100%;
  z-index: 99;
  top: 0;
  left: 0;
  background-color: #ffffff;
}
.navigation-bar {
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: center;
}
.navigation-buttons {
  display: flex;
  align-items: center;
  margin-left: 10px;
  border: 1px solid rgba(0, 0, 0, 0.05);
  box-sizing: border-box;
  border-radius: 15px;
  background-color: transparent;
}
.nav-img{
  height: 16px;
  width: 16px;
}
.navigation-title {
  position: absolute;
  left: 104px;
  right: 104px;
  text-align: center;
  font-size: 16px;
  font-weight: bold;
  color: #000000;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

 

Acho que você gosta

Origin blog.csdn.net/asteriaV/article/details/108778237
Recomendado
Clasificación