UITextView पाठ सामग्री ऊपर से शुरू नहीं होती है


79

मेरी JSON फ़ाइल से एक लंबा पाठ आ रहा है, लेकिन जब मैं अपने UIVIVController पृष्ठ पर जाने के लिए अपने UITableViewCell के लिंक पर क्लिक करता हूं, तो UITextView पाठ स्ट्रिंग सामग्री को लोड करता है, लेकिन यह शुरुआत से सामग्री नहीं दिखाता है और मुझे सभी को स्क्रॉल करना होगा समय।

मुझे क्या करना है?


क्या आपने कन्टैंटऑफ़सेट सेट करने की कोशिश की है (0,0)?
rdelmar

आप इस प्रश्न को संपादित कर सकते हैं। टैग के नीचे आपको 'संपादन' दिखाई देता है। संपादित करने के लिए उस पर क्लिक करें। मुझे एक संपादन के लिए एक सुझाव मिला है लेकिन लगता है कि उपयोगकर्ता को प्रश्न को संपादित करना चाहिए।
लैंटर्नमीक

इस पृष्ठ को देखें और देखें कि इनमें से कोई एक समाधान आपके लिए काम करता है या नहीं। यहाँ पर सब कुछ वहाँ पर है और अधिक stackoverflow.com/questions/1234242/… यदि आपके प्रश्न हैं कि क्या चल रहा है, काम कर रहा है, क्या आपने जो कोशिश की, वह विशिष्ट नहीं है।
लैंटर्नमीक

यहाँ मेरी समस्या के साथ लिंक है: लिंक
Ornilo

एकमात्र समाधान जो मेरे लिए काम करता था वह इस एक और पोस्ट से था
एंड्री बस

जवाबों:


160

मेरे पास एक ही समस्या थी, और मुझे पता चला कि मुझे इसके प्रभाव के लिए viewDidLayoutSubviews में सामग्री ऑफसेट सेट करना पड़ा था। मैं इस कोड का उपयोग स्टैटिक टेक्स्ट को प्रदर्शित करने के लिए कर रहा हूँ।

- (void)viewDidLayoutSubviews {
    [self.yourTextView setContentOffset:CGPointZero animated:NO];
}

स्विफ्ट 3:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

4
सभी उत्तरों में से, यह सबसे अच्छा काम करता है। इसके अलावा, आपके UITextView पाठ पाठ दृश्य तो जोड़ने के ऊर्ध्वाधर मध्य की ओर कहीं शुरू होता है, तो viewDidLoad के लिए निम्न वह भी ठीक कर देंगे: self.automaticallyAdjustsScrollViewInsets = false
Wizkid

दिलचस्प बात यह है, कि ऑफटुजिलियन के समाधान ने मेरे लिए काम किया, लेकिन आपके द्वारा दिए गए समाधान @Wizkid और ग्लेन ने iOS पर मेरे लिए इसे और भी बदतर बना दिया। वैसे भी अब यह काम कर रहा है और इससे मुझे खुशी हुई ^ ^
फ्रोज़न

2
हालांकि यह एक काम कर रहा समाधान है दुर्भाग्य से इसका एक बड़ा दुष्प्रभाव है बदसूरत दिखाई देने वाली अपसंस्कृति भले ही आप उपयोग कर रहे हों viewWillLayoutSubviews: /
होफी

समस्या को हल करने के लिए लगभग 6 तरीकों की कोशिश करते हुए, इस जवाब ने केवल मेरे लिए iOS9.x में काम किया।
कोरियनएक्सकोडर्कर

भले ही UITextView
हासी

46

यह एकमात्र तरीका है जिसने मेरे लिए काम किया। मैं दृश्य लोड होने से पहले UITextView की स्क्रॉल को अक्षम कर देता हूं और फिर मैं इसे फिर से सक्षम करता हूं:

  override func viewWillAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = false
    }

    override func viewDidAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = true
    }

2
सबसे अच्छा समाधान होने के न्यूनतम दृश्यमान दृश्य प्रभाव को स्क्रॉल करना है
होफि

मेरे लिए ठीक काम किया
thibut noah

उस समाधान का उपयोग करके iPad पर स्क्रॉल करते समय मेरे पास कुछ अव्यवस्थित मुद्दे थे।
एलियन


19

सामग्री लोड करने से पहले प्रोग्रामेटिक रूप से टेक्स्टव्यू की स्क्रॉलिंग संपत्ति को अक्षम करें textview.scrollenabled = NO;

और लोड करने के बाद टेक्स्टव्यू की स्क्रॉलिंग सक्षम करें textview.scrollenabled = YES;

साथ ही XIB, टेक्स्टव्यू के स्क्रॉलिंग सक्षम को हमेशा नॉन-चेक करें।


बहुत बहुत धन्यवाद, लेकिन अगर हमारे पास कलेक्शन या टेबलव्यू में यह यूटैक्सव्यू है तो यह काम नहीं करेगा
अम्र एंग्री

12

IOS 10 में UITextView के शीर्ष पर सवाल रिक्त स्थान के लिए जवाब एक बहुत क्लीनर अंत उपयोगकर्ता अनुभव प्रदान करते हैं।

में viewDidLoadदृश्य पाठ दृश्य युक्त नियंत्रक की:

 self.automaticallyAdjustsScrollViewInsets = false

सेटिंग textView.setContentOffset(CGPointMake(0,0), animated: false)और इनमें से कुछ अन्य सुझाव जब बुलाया जाता है तो काम करते हैंviewDidLayoutSubviews() आईपैड 2 और पुराने जैसे पुराने उपकरणों पर और स्क्रीन दिखाई देने पर आप वास्तव में टेक्स्ट को स्क्रॉल करते हुए देखेंगे। यह ऐसा कुछ नहीं है जिसे आप अंतिम उपयोगकर्ता को देखना चाहते हैं।


4

इन समाधानों का उपयोग करने के बाद भी मुझे समस्या हो रही थी। समस्या निश्चित रूप से पारदर्शी नेविगेशन पट्टियों से संबंधित है और व्यू कंट्रोलर पर सामग्री इनसेट को स्वचालित रूप से समायोजित करने के लिए चुनती है। यदि आप नेविगेशन पट्टी के नीचे अपने टेक्स्ट स्क्रॉलिंग के बारे में परवाह नहीं करते हैं, तो इन सेटिंग्स को छोड़ना और अपने टेक्स्टव्यू के शीर्ष को नेविगेशन बार के निचले भाग में देखने के लिए देखने के बजाय, कन्ट्रोल-कंट्रोलर के शीर्ष पर रोकना सबसे अच्छा है।

अगर मेरी तरह आप इसे नीचे स्क्रॉल करते समय अपने नेविगेशन बार के नीचे प्रकट करना चाहते थे; तब जो समाधान मेरे लिए काम करता था, वह यह था।

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height;

    [self.textView setContentOffset:CGPointMake(0, -offset) animated:NO];
}

यह सिर्फ नेविगेशन बार और स्टेटस बार की ऊंचाई के लिए दिखता है और तदनुसार सामग्री ऑफसेट समायोजित करता है।

ध्यान दें कि इस दृष्टिकोण का एक नकारात्मक पहलू यह है कि जब डिवाइस घूमता है तो आप शीर्ष पर वापस स्क्रॉल करना समाप्त करेंगे।


धन्यवाद - यह अंततः मुझे सही विचार पर ले गया :)
हन्नाहर्नी

4

मेरे लिए यह कोड ठीक काम करता है:

    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64 //or = 0 if no Navigation Bar
    textView.scrollEnabled = false
    textView.layoutIfNeeded()
    textView.scrollEnabled = true

सटीक स्थिति पर स्क्रॉल करने और स्क्रीन के शीर्ष पर दिखाने के लिए मैं इस कोड का उपयोग करता हूं:

    var scrollToLocation = 50 //<needed position>
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))

ContentOffset.y को पाठ के अंत में स्क्रॉल करना, और फिर स्क्रॉलरेंजटाउवी स्क्रॉल स्क्रॉलटालोकेशन के मान तक स्क्रॉल करना। इस प्रकार, आवश्यक स्थिति स्क्रॉल दृश्य की पहली पंक्ति में दिखाई देती है।


4

कुछ अन्य उत्तरों के समान, लेकिन बाद के लाभ से कि आप बाद में डिवाइस के घुमाव पर स्क्रॉल करने का कारण नहीं बनेंगे। स्विफ्ट 2.2 में अच्छा काम करता है

/// Whether view has laid out subviews at least once before.
var viewDidLayoutSubviewsAtLeastOnce = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if !viewDidLayoutSubviewsAtLeastOnce {
        textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false)
    }

    viewDidLayoutSubviewsAtLeastOnce = true
}

कुछ अलग उत्तरों की कोशिश करने के बाद इसने मेरे लिए सबसे अच्छा काम किया। स्विंडर के उत्तर के अनुसार, आप CGPoint के लिए CGPointZero का उपयोग कर सकते हैं।
मिच डाउनी

इस विधि में ऐसा करना महत्वपूर्ण है - viewDidLayoutSubviews। कई उत्तर आपको यह देखने में मिलेंगेWillAppear, लेकिन यह गलत है। viewDidLayoutSubviews ऐसा करने का स्थान है। धन्यवाद।
गीकेलेक्स

3

स्विफ्ट संस्करण

चीजों के संयोजन की आवश्यकता होगी:

1.) अपना आउटलेट सेट करें

  @IBOutlet var textView: UITextView!

2.) व्यूबोर्ड में स्टोरीबोर्ड पर "एडजस्ट स्क्रॉल व्यू इनसेट्स" को बंद करें

3.) अपने दृश्य नियंत्रक के नीचे जोड़कर सामग्री को शून्य शीर्ष पर सेट करें

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews()
     myUITextView.setContentOffset(CGPointZero, animated: false)
}

'CGPointZero' स्विफ्ट में उपलब्ध नहीं है
अली

3

इसके बजाय से ऑफसेट सामग्री की स्थापना की viewDidLayoutSubviews आप लिख सकते हैं layoutIfNeeded से viewDidLoad नीचे के रूप में TextView की उचित स्थिति निर्धारित करने के लिए:

    self.textView.layoutIfNeeded()
    self.textView.setContentOffset(CGPoint.zero, animated: false)

चियर्स !!


2

स्विफ्ट 2 में, Xcode 7 समाधान, स्क्रोल को सक्षम करने के साथ-साथ पाठ को शीर्ष पर शुरू करने के लिए, यह आप सभी हैं:

@IBOutlet weak var myUITextView: UITextView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //start scroll at top of text
    myUITextView.scrollRangeToVisible(NSMakeRange(0, 0))
}

1
धन्यवाद! यह स्विफ्ट 2.2 के साथ मेरे लिए पूरी तरह से काम करता है। अन्य समाधानों में से कोई भी यहाँ सरलता और सरलता से काम नहीं करता है।
नतालिया

2

स्विफ्ट 3.0

override func viewWillAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = true
}

स्टोरीबोर्ड में स्क्रॉल करना अक्षम करें! और कोड में सक्षम करें। ओवरराइड func viewDidAppear (_ एनिमेटेड: बूल) {privacyText.isScrollEnabled = true}
विटाली ए


1

यहां यह करने का एक और तरीका है जो हमेशा मेरे लिए काम करता है। उद्देश्य सी:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.textView setContentOffset:CGPointZero animated:NO];
}

और स्विफ्ट में:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    textView.setContentOffset(CGPointZero, animated: false)
}


1

अपने फंक्शन कंट्रोलर क्लास में निम्न फंक्शन जोड़ें ...

Swift 3

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(.zero, animated: false)
}
Swift 2.1

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Objective C

- (void)viewDidLayoutSubviews {
    [self.mainTextView setContentOffset:CGPointZero animated:NO];
}

在 在 D ViewDidAppear 加上 在 在 在 在 在 在 在 在 在 在 在 在 在


क्या आप कृपया अंतिम वाक्य का अंग्रेजी में अनुवाद कर सकते हैं?
गाइल्स गोइलार्डेट 4

1

जवाब के किसी भी पाठ के साथ स्विफ्ट 4 में कोई भी मेरी मदद नहीं करता है और मैं विषय में कुछ उत्तरों को संयोजित करता हूं।

override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
     uiTextview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
     uiTextview.isScrollEnabled = true
     uiTextview.setContentOffset(CGPoint.zero, animated: false)
}

अगर uittextview कलेक्शन व्यू या टेबलव्यू में है तो क्या होगा
अमृत ​​एंग्री

@ArrAngry मुझे कोई पता नहीं है, मैंने इसे सिर्फ टेक्स्ट व्यू के लिए उपयोग किया है
hall.keskin

धन्यवाद मैं tetxview.scrollRangeToV अदृश्य (NSMakeRange (0, 0)) का उपयोग करता हूं
अमृत ​​गुस्सा

1

स्विफ्ट 3, 4, 5 समाधान:

समस्या को हल करने के लिए कदम:

  • UITextView स्क्रॉल अक्षम करें
  • scrollRectToV अदृश्य सेट करें
  • UITextView स्क्रॉल सक्षम करें

कोड:

yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
yourTextView.scrollRectToVisible(rect, animated: false)
yourTextView.isScrollEnabled = true

यह मेरे लिए काम किया। उम्मीद है कि मदद मिलेगी!


एक आसान आसान स्पष्टीकरण के लिए धन्यवाद मोहित।
प्रवीण कुमार वर्मा

0

मैंने इस तरह से इसे किया। मैंने टेक्स्टव्यू को उप-वर्गित किया, और:

override func willMoveToSuperview(newSuperview: UIView?) {
    self.scrollEnabled = false
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.scrollEnabled = true
}

0

स्टोरीबोर्ड से, वह व्यू कंट्रोलर चुनें, जिस पर आपने टेक्स्ट व्यू रखा है। गुण निरीक्षक में, "स्क्रॉल दृश्य इनसेट समायोजित करें" को अनचेक करें। बस।


0

इस कोड को अपनी कक्षा में रखें

override func viewDidLayoutSubviews() {
        self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.