2015-10-19 25 views
8

Tôi đang cố sử dụng ScrollView ngang trong React Native cho Android, vị trí bắt đầu ở giữa hình ảnh cuộn thay vì (0,0).Phản ứng cuộn Android ScrollView gốc Để không hoạt động

Phương thức scrollTo dường như được gọi chính xác bên trong componentDidMount nhưng không có gì di chuyển trong ứng dụng, nó vẫn hiển thị khi bắt đầu cuộn tất cả các con đường sang trái.

Vì đây là Android, tôi không có quyền truy cập vào các đạo cụ contentOffset hoặc tôi sẽ đặt trực tiếp, theo tài liệu. Đây là mã:

'use strict'; 

var React = require('react-native'); 
var { 
    StyleSheet, 
    View, 
    Text, 
    ScrollView, 
    Component, 
} = React; 
var precomputeStyle = require('precomputeStyle'); 

class Carousel extends Component { 
    constructor(props, context) { 
    super(props, context); 
    //this.changeContent = this.changeContent.bind(this); 
    } 

    componentDidMount() { 
    this.myScroll.scrollTo(100); 
    console.log("called DidMount"); 
    } 

    render() { 
    return (
     <View style={{flex: 1}}> 
     <ScrollView ref={(ref) => this.myScroll = ref} 
      contentContainerStyle={styles.container} 
      horizontal={true} 
      pagingEnabled={true} 
      showsHorizontalScrollIndicator={false} 
      bounces={true} 
      onMomentumScrollEnd={this.onAnimationEnd} 
     > 
      {this.props.children} 
     </ScrollView> 
     </View> 
    ); 
    } 

    onAnimationEnd(e) { 
    console.log("curr offset: " + e.nativeEvent.contentOffset.x); 
    } 
} 

var styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    }, 
    page: { 
    alignItems: 'center', 
    justifyContent: 'center', 
    borderWidth: 1, 
    }, 
}); 

module.exports = Carousel; 
+1

Bạn có thể thử thêm tọa độ Y không? Ví dụ. 'scrollTo (100, 0)'. – Felix

+0

Tôi đã làm và sự cố vẫn như cũ, tọa độ còn thiếu chỉ mặc định nếu không được chỉ định. –

+0

Tôi nghĩ nó thực sự là 'scrollTo (y, x)' nhưng cú pháp đó không được chấp nhận. Bây giờ là 'scrollTo ({x: n, y: n, hoạt hình: bool})' và như Rob đã đề cập, bạn có thể bỏ qua 'x',' y' và 'hoạt hình' tùy theo nhu cầu của bạn. – PhilT

Trả lời

26

tôi gặp cùng một vấn đề, và chất thải vài giờ trong nó: 1 trong android, scrollview có thể di chuyển chỉ khi kích thước < nội dung kích thước 2 của nó trong phản ứng android bản xứ, nếu bạn gọi scrollView.scrollTo() trong componentDidMount, nó sẽ không làm việc, becaus scrollview có một hình ảnh động bố trí khi tạo, bạn có thể tìm thấy nó trong ReactScrollView.java

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    // Call with the present values in order to re-layout if necessary 
    scrollTo(getScrollX(), getScrollY()); 
} 

vậy, bạn phải trì hoãn nó sau khi hình ảnh động

componentDidMount() { 
    InteractionManager.runAfterInteractions(() => { 
     this.myScroll.scrollTo(100); 
     console.log("called DidMount"); 
    }) 
} 
+1

Cảm ơn bạn rất nhiều! Làm thế nào bạn kết thúc gỡ lỗi này? –

+2

Giải pháp này hoạt động, nhưng tôi phải thêm một sự chậm trễ bên trong hàm này: '_.delay (() => this._scroll.scrollTo ({x: 1000, hoạt ảnh: false}), 100); ' – Eldelshell

+0

Chỉ cần sử dụng một sự chậm trễ mà không có trình quản lý tương tác làm việc cho tôi trên một ScrollView. Tôi sẽ đăng một câu trả lời với mã như tôi đã gặp khó khăn khi tìm một nguồn tài nguyên tốt về điều này. – PhilT

5

Tính năng này hoạt động trên React Native 0.44.0. Cảm ơn gợi ý @Eldelshell. Nó cũng có vẻ làm việc với bất kỳ giá trị timeout nào. Ít nhất là trên trình mô phỏng. Tôi thấy rằng câu trả lời liên quan đến InteractionManager.runAfterInteractions không có gì để khắc phục vấn đề nhưng có lẽ đó là sự khác biệt trong các phiên bản.

componentDidMount() { 
    setTimeout(() => { 
    this._scroll.scrollTo({y: 100}) 
    }, 1) 
} 
+0

Câu trả lời này giả định rằng hoạt ảnh ban đầu của ScrollView được hoàn thành trong vòng 1ms. Điều này có thể xảy ra hầu hết thời gian, nhưng nó không được bảo đảm. Đó là lý do tại sao 'InteractionManager.runAfterInteractions()' là giải pháp ưu tiên, và 'setTimeout()' có phần hơi cẩu thả. –

Các vấn đề liên quan