স্ক্রোলভিউটি নীচে স্ক্রোল করা কী সম্ভব?


90

চ্যাটের মতো অ্যাপের জন্য, আমি একটি ScrollViewউপাদানটি নীচে স্ক্রল করে রাখতে চাই , কারণ পুরানোগুলির অধীনে নতুন বার্তাগুলি প্রদর্শিত হয়। আমরা একটি এর স্ক্রোল অবস্থান সামঞ্জস্য করতে পারি ScrollView?


4
আমি প্রতিক্রিয়া-স্থানীয় সম্পর্কে কিছু জানি না, তবে কখনও কখনও মনে রাখবেন ব্যবহারকারীরা চ্যাটের ইতিহাস দেখতে স্ক্রোল করতে চান। কোনও নতুন বার্তা আসার পরে চ্যাটটি ইতিমধ্যে নীচের দিকে সমস্ত ভাবে স্ক্রল করা থাকলে কেবল চ্যাটটি স্ক্রোল করার বিষয়টি নিশ্চিত করুন।
ডেভিড

এটা একটা ভালো বুদ্ধি. আমরা এই সমস্যাটি এখানে ট্র্যাক করছি: github.com/facebook/react-native/issues/107
এরিক ভেন্টিটি

আমি কেবল একটি অনুরূপ প্রশ্নের উত্তর দিয়েছি, দয়া করে এটি এখানে দেখুন - stackoverflow.com/a/32652967/1541508
কোহভার

এটা কি তোমার প্রশ্নের উত্তর? নেটিভ
তালিকাভুক্তির

উত্তর:


166

নেটিভ 0.41 এবং তার পরে প্রতিক্রিয়ার জন্য , আপনি বিল্ট-ইন scrollToEndপদ্ধতিতে এটি করতে পারেন :

<ScrollView
    ref={ref => {this.scrollView = ref}}
    onContentSizeChange={() => this.scrollView.scrollToEnd({animated: true})}>
</ScrollView>

4
নেটিভ 0.55.4 এবং ততোধিক প্রতিক্রিয়া থেকে, rootঅন্যথায় আমাকে ব্যবহার করতে হবে, স্ক্রোলটো ইন্ড অপরিজ্ঞাত। অর্থাত্this.scrollView.root.scrollToEnd
সাইমন

4
বর্তমানে দেশীয় 0.58.6 প্রতিক্রিয়া ব্যবহার করে এবং rootপ্রকৃতপক্ষে ব্যবহার করে একটি অনির্ধারিত ত্রুটি ছুঁড়েছে।
জোসে বার্নহার্ট

4
এটি হওয়া উচিত: ref={ref => {this.scrollView = ref}}যেহেতু আপনি অ্যাসাইনমেন্টটি ফিরিয়ে দিতে চান না
হ্যাম্পাইক্যাক

26

স্ক্রোল ভিউ (উচ্চতা) এর নীচের Y এর ট্র্যাক রাখতে অনকন্টেসাইজ চেঞ্জ ব্যবহার করুন

https://facebook.github.io/react-native/docs/scrollview.html#oncontentsizechange

var _scrollToBottomY

<ScrollView
    onContentSizeChange={(contentWidth, contentHeight)=>{
    _scrollToBottomY = contentHeight;
    }}>
</ScrollView>

তারপরে স্ক্রোল ভিউয়ের রেফ নাম ব্যবহার করুন

this.refs.scrollView.scrollTo(_scrollToBottomY);

4
মনে রাখবেন যে এই দৃশ্যটি পুরোপুরি নীচে স্ক্রোল করে, সুতরাং ভিউটি মূলত দৃশ্যমান নয় (আপনি যদি পরিমাপের পরে এতে কিছু যোগ না করেন)। কোডটি স্ক্রোলযোগ্য ক্ষেত্রের উচ্চতায় স্ক্রোল করার পরে, স্ক্রোলযোগ্য অঞ্চল উপচে পড়া বাচ্চাদের উচ্চতায় নয় (সম্ভবত ওপি যা চেয়েছিল তা নয়) এটি বোঝা যায়। পরিবর্তে stackoverflow.com/a/39563193/1526986 দেখুন ।
xixixao

21

এখানে আমি সবচেয়ে সহজ সমাধানটি সংগ্রহ করতে পারি:

 <ListView
ref={ref => (this.listView = ref)}
onLayout={event => {
    this.listViewHeight = event.nativeEvent.layout.height;
}}
onContentSizeChange={() => {
    this.listView.scrollTo({
        y: this.listView.getMetrics().contentLength - this.listViewHeight
    });
}}
/>;

4
আমি যখন এই বা অন্যান্য অনুরূপ উত্তরগুলি ব্যবহার করি তখন এটি তালিকার আইটেমগুলিকে অদৃশ্য করে দেয় (দেখে মনে হচ্ছে এটি খুব বেশি স্ক্রোল করছে , তবে আমি নিশ্চিত হতে পারি না)। একটি সামান্য বিট স্ক্রোলিং সবকিছু পুনরায় প্রদর্শিত হয়, এবং একধরণের চেহারা দেখে মনে হচ্ছে এটি পিছনে পিছলে চলেছে (অতএব স্ক্রোলিংটি খুব দূরের তত্ত্ব)। কোন স্পষ্ট ধারণা কেন হতে পারে?
tscizzle

16

হুক ব্যবহার করতে পারে এমন কারও ফাংশন উপাদান লিখছেন,

import React, { useRef } from 'react';
import { ScrollView } from 'react-native';

const ScreenComponent = (props) => {
  const scrollViewRef = useRef();
  return (
    <ScrollView
      ref={scrollViewRef}
      onContentSizeChange={() => scrollViewRef.current.scrollToEnd({ animated: true })}
    />
  );
};

4
সহজ এবং মার্জিত। আমি যা চেয়েছিলাম তা পুরোপুরি করে! ধন্যবাদ!
কামার স্টেশনওয়ালা

6

২০২০ বা তার পরের যে কেউ কার্যক্ষম উপাদানগুলির সাথে এটি কীভাবে অর্জন করবেন তা ভাবছেন। আমি এইভাবে করেছি:

ref={ref => scrollView = ref }
onContentSizeChange={() => scrollView.scrollToEnd({ animated: true })}>

দ্রষ্টব্য: আপনি উল্লেখ করতে পারেন যে আপনি ব্যবহার করছেন। বেশিরভাগ পিপিএল হুকস সহ রেফ কীভাবে ব্যবহার করবেন তা জানেন না।
11zɐɹƆ

হ্যাঁ. জিনিসটি হ'ল এটি ইউএসআরফ হুক ব্যবহার না করার পরেও কার্যকর হয়েছিল। তবে সঠিক উপায়টি এটি ব্যবহার করা! আপনি ঠিক বলেছেন
মারলন অ্যাংলেমাম


4

আপনি react-native-invertible-scroll-viewমডিউলটি ব্যবহার করে স্ক্রোল / তালিকার ভিউটি উল্টাতে পারেন , তারপরে কেবল ref.scrollTo(0)নীচে স্ক্রোল করতে কল করুন ।

মডিউলটি ইনস্টল করুন:

npm install --save react-native-invertible-scroll-view

তারপরে উপাদানটি আমদানি করুন:

import InvertibleScrollView from 'react-native-invertible-scroll-view';

তারপরে এটার পরিবর্তে নিম্নলিখিত জেএসএক্স ব্যবহার করুন ScrollView:

<InvertibleScrollView inverted
    ref={ref => { this.scrollView = ref; }}
    onContentSizeChange={() => {
        this.scrollView.scrollTo({y: 0, animated: true});
    }}
>
    { /* content */ }
</InvertibleScrollView>

এটি react-native-invertible-scroll-viewপুরোপুরি দেখার বিষয়বস্তু উল্টায় কারণ এটি কাজ করে । মনে রাখবেন যে ভিউয়ের বাচ্চারাও বিপরীত ক্রমে সাধারণ দর্শনে রেন্ডার করবে - প্রথম শিশুটি নীচে উপস্থিত হবে ।


3

আসলে @ অণিরুদ্ধ উত্তর আমার পক্ষে কাজ করে না কারণ আমি ব্যবহার করছি "react-native": "0.59.8"এবং this.scrollView.root.scrollToEndএটি অপরিজ্ঞাত ined

তবে আমি এটি আবিষ্কার করেছি এবং এটি কাজ করে this.scrollView.scrollResponderScrollToEnd({animated: true});

আপনি যদি এটি ব্যবহার করেন 0.59.8তবে OR কাজ করবে যদি আপনি পরে সংস্করণ ব্যবহার করেন এবং এটি আপনার জন্য কাজ করে। দয়া করে এই উত্তরে সংস্করণগুলি যুক্ত করুন যাতে অন্যরা সমস্যায় না পড়ে।

এখানে সম্পূর্ণ কোড

<ScrollView
    ref={ref => this.scrollView = ref}
    onContentSizeChange={(contentWidth, contentHeight)=>{        
        this.scrollView.scrollResponderScrollToEnd({animated: true});
    }}>
</ScrollView>

1

এই পদ্ধতিটি খানিকটা হ্যাকি তবে এর থেকে ভাল আর কোনও উপায় খুঁজে পেলাম না

  1. প্রথমে আপনার স্ক্রোলভিউতে একটি রেফ যুক্ত করুন।
  2. দ্বিতীয়টি আপনার স্ক্রোলভিউ ট্যাগটি বন্ধ করার আগে একটি ডামি ভিউ যুক্ত করুন
  3. সেই ডামি ভিউয়ের y অবস্থানটি পান
  4. যখনই আপনি নীচে স্ক্রোল করতে চান ডামি ভিউয়ের অবস্থানে

var footerY; //Y position of the dummy view
render() {    
    return (
      <View>
          <ScrollView 
          ref='_scrollView'>
            // This is where all the things that you want to display in the scroll view goes
            
            // Below is the dummy View
            <View onLayout={(e)=> {
              footerY = e.nativeEvent.layout.y;
              }}/>
          </ScrollView>
              
          //Below is the button to scroll to the bottom    
          <TouchableHighlight
            onPress={() => { this.refs._scrollView.scrollTo(footerY); }}>
            <Text>Scroll to Bottom</Text>
          </TouchableHighlight>
        
      </View>
    );
  }


এই নয় বেশ কি জন্য জিজ্ঞাসা করা হল; এই স্ক্রোলটি ট্যাপের নীচে স্ক্রোলভিউটি কন্টেন্ট যোগ করার সাথে সাথে নীচে স্ক্রোল করা না রেখে। যাইহোক, scrollToBottomপ্রতিক্রিয়া নেটিভ এর নতুন সংস্করণে এই অপ্রচলিত মত পন্থা তৈরি করে।
মার্ক

1

এটি আপনার প্রশ্নের উত্তর দেয়: https://stackoverflow.com/a/39563100/1917250

আপনাকে এর স্ক্রোলভিউয়ের উচ্চতা বিয়োগের উচ্চতা গণনা করে অবিচ্ছিন্নভাবে পৃষ্ঠার নীচে স্ক্রোল করা উচিত।


এটি প্রশ্নের সঠিক উত্তর। কখন স্ক্রোলটি সম্পাদন করবেন সে সম্পর্কে আপনি স্মার্ট হতে পারেন, লিঙ্কের উত্তরটি আপনাকে কীভাবে প্রয়োজনীয় নম্বরগুলি পাবেন তা আপনাকে দেখায়। বিশেষত, আপনি যদি তালিকায় উপাদানগুলি যুক্ত করছেন, উপাদান ডিডআপডেট কল করার সময় সামগ্রীর উচ্চতা সেগুলি অন্তর্ভুক্ত করবে না, সুতরাং আপনি মনে রাখতে চান যে পরিবর্তে আপনি অনকন্টিজাইজ চেঞ্জে স্ক্রোল করতে এবং স্ক্রোল করতে চান।
xixixao

1

আপনি যদি টাইপস্ক্রিপ্ট ব্যবহার করেন তবে আপনার এটি করা দরকার

interface Props extends TextInputProps { 
     scrollRef?: any;
}

export class Input extends React.Component<Props, any> {
     scrollRef;
constructor(props) {
    this.scrollRef = React.createRef();
}
<ScrollView
    ref={ref => (this.scrollRef = ref)}
    onContentSizeChange={() => {
    this.scrollRef.scrollToEnd();
    }}
>
</ScrollView>

0

আমি এটির সাথে কিছুক্ষণ লড়াই করেছি এবং অবশেষে এমন কিছু নিয়ে এসেছি যা আমার পক্ষে সত্যই ভাল এবং মসৃণ কাজ করেছে। অনেকের মতো আমিও .scrollToEndকোনও লাভ করার চেষ্টা করিনি । সমাধান আমার জন্য কাজ সংমিশ্রণ ছিল onContentSizeChange, onLayoutসাজসরঞ্জাম এবং একটি সামান্য বিট আরো সত্যিই বোঝানো "কি নীচে স্ক্রলিং" চাক্ষুষরূপে চিন্তা। শেষ অংশটি এখন আমার কাছে তুচ্ছ মনে হচ্ছে, তবে এটি চিরকালের জন্য আমাকে বের করে নিল।

প্রদত্ত যেটির ScrollViewএকটি নির্দিষ্ট উচ্চতা রয়েছে, যখন সামগ্রীর উচ্চতা ধারকটির উচ্চতা ছাড়িয়ে যায়, আমি (সামগ্রীর উচ্চতা) এর জন্য prevHeight(এর নির্দিষ্ট উচ্চতা ScrollView) বিয়োগ করে অফসেটটি গণনা করেছি currHeight। আপনি যদি দৃশ্যমানভাবে এটি কল্পনা করতে পারেন, y- অক্ষের মধ্যে এই পার্থক্যের দিকে স্ক্রোল করে that অফসেট দ্বারা সামগ্রীর উচ্চতাটিকে তার ধারকটির উপরে স্লাইড করে। আমি আমার অফসেটটি বাড়িয়েছি এবং আমার এখনকার সামগ্রীটিকে আমার আগের উচ্চতা তৈরি করেছি এবং একটি নতুন অফসেট গণনা করতে থাকি।

কোডটি এখানে। আশা করি এটি কাউকে সাহায্য করবে।

class ChatRoomCorrespondence extends PureComponent {
  currHeight = 0;
  prevHeight = 0;
  scrollHeight = 0;

  scrollToBottom = () => {
    this.refs.scrollView.getScrollResponder().scrollResponderScrollTo({
      x: 0,
      y: this.scrollHeight,
      animated: true
    });
  };

  render() {
    return (
      <ScrollView
        style={Styles.container}
        ref="scrollView"
        onContentSizeChange={(w, h) => {
          this.currHeight = h;

          if (
            this.prevHeight > 0 &&
            this.currHeight - this.scrollHeight > this.prevHeight
          ) {
            this.scrollHeight += this.currHeight - this.prevHeight;
            console.log("--------------------------------------------");
            console.log("Curr: ", this.currHeight);
            console.log("Prev: ", this.prevHeight);
            console.log("Scroll: ", this.scrollHeight);
            this.prevHeight = this.currHeight;
            console.log("PREV: ", this.prevHeight);
            console.log("--------------------------------------------");

            this.scrollToBottom();
          }
        }}
        onLayout={ev => {
          // Fires once
          const fixedContentHeight = ev.nativeEvent.layout.height;
          this.prevHeight = fixedContentHeight;
        }}
      >
        <FlatList
          data={this.props.messages}
          renderItem={({ item }) => (
            <ChatMessage
              text={item.text}
              sender={item.sender}
              time={item.time}
              username={this.props.username}
            />
          )}
          keyExtractor={(item, index) => index.toString()}
        />
      </ScrollView>
    );
  }
}

0

আমার ধারণা, উত্তর দিতে দেরি হয়ে গেছে তবে আমি একটি হ্যাক পেয়েছি! আপনি ব্যবহার করেন তাহলে FlatListআপনি সক্ষম করতে পারেন invertedসম্পত্তি যা সেটিং ফিরে বৃক্ষের পতন transform scaleথেকে -1(যা মত অন্যান্য তালিকা উপাদান জন্য গ্রহণযোগ্য ScrollView...)। আপনি যখন আপনার FlatListডেটা দিয়ে রেন্ডার করবেন এটি সর্বদা নীচে থাকবে!


-1

সামগ্রীর বর্তমান উচ্চতায় স্ক্রোল দৃশ্যের অফসেট সম্পত্তি সেট করার চেষ্টা করুন ।

আপনার যা প্রয়োজন তা পূরণ করতে আপনি অনস্ক্রোল ইভেন্টের অংশ হিসাবে এটি করতে পারেন। তবে এটি কোনও খারাপ ব্যবহারকারীর অভিজ্ঞতা অর্জন করতে পারে তাই এটি কোনও নতুন বার্তা যুক্ত হলে কেবল এটি করতে বেশি ব্যবহারকারী-বান্ধব প্রমাণ হতে পারে।


-1; না উত্তর এখানে অনেক ভালো লেগেছে, এই স্ক্রলিং এর প্রভাব রয়েছে ScrollViewনিচে নিচে এর সমস্ত বিষয়বস্তুর বদলে শুধু নীচে স্ক্রলিং।
মার্ক

-1

আমারও একই সমস্যা ছিল, তবে এই পৃষ্ঠাটি পড়ার পরে (যা আমাকে মাথা ব্যথা দেয়!) আমি এই খুব সুন্দর এনপিএম প্যাকেজটি পেয়েছি যা কেবলমাত্র তালিকাভিউকে উল্টে দেয় এবং চ্যাট অ্যাপ্লিকেশনটির জন্য সবকিছু সহজ করে দেয় !!


-1; এটি এখানে পূর্বে পোস্ট করা উত্তর নকল করে (এবং এটি কিছুটা বিভ্রান্তও; এই প্রশ্নটি a ScrollViewলিস্টভিউ` নয়, এ সম্পর্কিত)।
মার্ক আমেরিকান

-3

কিছুটা দেরি ... তবে এই প্রশ্নটি দেখুন। স্ক্রোলভিউয়ের শীর্ষে স্ক্রোল করুন

স্ক্রোলভিউয়ের একটি "স্ক্রোলটো" পদ্ধতি রয়েছে।


4
হ্যাঁ স্ক্রোলভিউতে একটি স্ক্রোলটো পদ্ধতি রয়েছে তবে প্রশ্নটি বিশেষত নীচে স্ক্রোলিংয়ের বিষয়ে জিজ্ঞাসা করছে যা সোজা নয়।
সাউদার্নির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.