【问题标题】:React Native `alignItems: 'flex-end'` hides content in TabBarIOS componentReact Native`alignItems:'flex-end'`隐藏TabBarIOS组件中的内容
【发布时间】:2016-12-30 21:56:24
【问题描述】:

这个问题类似于this one,但是我有不同的要求。我有一个<TabBarIOS> 组件,它从react-native-camera 呈现<Camera>。我需要在<Camera> 组件的底部但<TabBarIOS> 组件的上方放置一个拍照按钮。

index.ios.js

import React, { Component } from 'react';
import {
  AppRegistry,
  TabBarIOS,
  ScrollView,
  StyleSheet,
  Text,
  View
} from 'react-native';
import CameraTab from './views/CameraTab.ios.js';
import FilesTab from './views/FilesTab.ios.js';
import Icon from 'react-native-vector-icons/MaterialIcons';

export default class MyApp extends Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedTab: 'cameraTab'
    };
  };

  _renderContent() {
    switch (this.state.selectedTab) {
      case "filesTab":
        return <FilesTab style={styles.tabContent}></FilesTab>;
      case "cameraTab":
        return <CameraTab style={styles.tabContent}></CameraTab>;
      case "settingsTab":
        return <View style={styles.tabContent}></View>;
      default:
        return <View style={styles.tabContent}></View>;
    }
  };

  render() {
    return (
      <TabBarIOS
        tintColor="#3498db"
        barTintColor="#ecf0f1">
        <Icon.TabBarItemIOS
          title="Files"
          iconName="folder"
          selected={this.state.selectedTab === "filesTab"}
          onPress={() => {
            this.setState({
              selectedTab: "filesTab",
            });
          }}>
          {this._renderContent()}
        </Icon.TabBarItemIOS>
        <Icon.TabBarItemIOS
          title="Camera"
          iconName="photo-camera"
          badge={this.state.notifCount > 0 ? this.state.notifCount : undefined}
          selected={this.state.selectedTab === "cameraTab"}
          onPress={() => {
            this.setState({
              selectedTab: "cameraTab",
              notifCount: this.state.notifCount + 1,
            });
          }}>
          {this._renderContent()}
        </Icon.TabBarItemIOS>
        <Icon.TabBarItemIOS
          title="Settings"
          iconName="settings"
          selected={this.state.selectedTab === 'settingsTab'}
          onPress={() => {
            this.setState({
              selectedTab: "settingsTab",
              presses: this.state.presses + 1
            });
          }}>
          {this._renderContent()}
        </Icon.TabBarItemIOS>
      </TabBarIOS>
    );
  }
}

var styles = StyleSheet.create({
  tabContent: {},
});

AppRegistry.registerComponent('myapp', () => myApp);

CameraTab.ios.js

import React, { Component } from 'react';
import {
  Dimensions,
  StyleSheet,
  Text,
  View
} from 'react-native';
import Camera from 'react-native-camera';

export default class CameraTab extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  };

  render() {
    return (
      <Camera
        ref={(cam) => {
          this.camera = cam;
        }}
        style={styles.preview}
        aspect={Camera.constants.Aspect.fill}>
      </Camera>
    );
  }

  takePicture() {
    this.camera.capture()
      .then((data) => console.log(data))
      .catch(err => console.error(err));
  }
}

var styles = StyleSheet.create({
  preview: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'flex-end',
    height: Dimensions.get('window').height,
    width: Dimensions.get('window').width
  },
  capture: {
    backgroundColor: '#fff',
    borderRadius: 5,
    color: '#000',
    height: 20
  }
});

module.exports = CameraTab;

我尝试了各种方法,但当alignItems: 'flex-end' 处于容器组件的样式中时,捕获按钮总是隐藏。

它应该看起来像这样:

编辑:我发现this issue 描述了一种解决方法(将按钮组件放在相机组件之外)。根据 RN 在Height and Width 上的文档,该解决方案似乎适用于所有屏幕尺寸。但是这对我不起作用,因为我想要一个在相机内带有图标的子视图。

【问题讨论】:

    标签: react-native react-native-camera react-native-flexbox tabbarios


    【解决方案1】:

    好的,终于修好了。我认为问题与preview 样式的高度和宽度有关。工作代码:

    import React, { Component } from 'react';
    import {
      Dimensions,
      StyleSheet,
      Text,
      TouchableHighlight,
      View
    } from 'react-native';
    import Camera from 'react-native-camera';
    import Icon from 'react-native-vector-icons/Ionicons';
    
    export default class CameraTab extends Component {
      constructor(props) {
        super(props);
        this.state = {};
      };
    
      render() {
        return (
          <View style={styles.container}>
            <Camera
              ref={(cam) => {
                this._camera = cam;
              }}
              style={styles.preview}
              aspect={Camera.constants.Aspect.fill}
              captureTarget={Camera.constants.CaptureTarget.disk}>
              <TouchableHighlight
                  style={styles.cameraButton}
                  onPress={this._takePicture.bind(this)}>
                  <Icon name="ios-qr-scanner" size={55} color="#95a5a6" />
              </TouchableHighlight>
            </Camera>
          </View>
        );
      }
    
      _takePicture() {
        this._camera.capture()
          .then((data) => {
            console.log(data)
          })
          .catch((err) => {
            console.error(err)
          });
      }
    }
    
    var styles = StyleSheet.create({
      cameraButton: {
        flex: 0,
        flexDirection: 'row',
        marginBottom: 60,
      },
      container: {
        flex: 1,
      },
      preview: {
        flex: 1,
        flexDirection: 'row',
        alignItems: 'flex-end',
        justifyContent: 'space-around'
      },
    });
    
    module.exports = CameraTab;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 2021-06-03
      • 1970-01-01
      • 2016-03-29
      • 2020-03-28
      • 2010-09-27
      • 1970-01-01
      相关资源
      最近更新 更多