हर बार जब मैं टेक्स्ट बदलता हूं, तो मैं UITextView को शीर्ष पर स्क्रॉल करने के लिए कैसे मजबूर करूं?


99

ठीक है, मैं के साथ कुछ समस्या आ रही है UITextView। यहाँ मुद्दा है:

मैं कुछ पाठ जोड़ता हूँ a UITextView। उपयोगकर्ता तो कुछ का चयन करने के लिए डबल क्लिक करता है। मैं तब पाठ को UITextView(प्रोग्रामिक रूप से ऊपर) और UITextView पृष्ठ के निचले भाग पर स्क्रॉल करता हूं जहां कर्सर है।

हालाँकि, यह वह जगह नहीं है जहाँ उपयोगकर्ता ने क्लिक किया। यह हमेशा इस बात पर UITextViewध्यान देता है कि उपयोगकर्ता ने कहाँ क्लिक किया है।

इसलिए यहाँ मेरा प्रश्न है: UITextViewमैं पाठ को बदलने के लिए हर बार शीर्ष पर स्क्रॉल करने के लिए कैसे मजबूर करूँ ? मैं कोशिश की है contentOffsetऔर scrollRangeToVisible। न ही काम।

किसी भी सुझाव की सराहना की जाएगी।

जवाबों:


148
UITextView*note;
[note setContentOffset:CGPointZero animated:YES];

यह मेरे लिए करता है।

स्विफ्ट संस्करण (Xcode 9.3 पर iOS 11 के साथ स्विफ्ट 4.1):

note.setContentOffset(.zero, animated: true)

13
मेरे लिए मदद नहीं है।
दिमित्री

6
यह काम करता है, लेकिन यह आवश्यक क्यों है? Apple के स्क्रॉल तर्क को परिष्कृत करने की ज़रूरत है, चीजों को प्राप्त करने के लिए बहुत अधिक घेरा कूदना है जिस तरह से वे ज्यादातर मामलों में स्वचालित रूप से करना चाहिए।
जॉन कॉन्टारिनो

4
मेरे लिए iOS 9 में काम करता है लेकिन पहले की तुलना में नहीं viewDidAppear()
मुरैना सागर

4
आप इसे viewDidAppear () से पहले कॉल करके viewDidLayoutSubviews ()
आर्कडी बॉब

मैंने तालिका के सेल में पाठ दृश्य जोड़ दिया है इसलिए मैं इसे पंक्ति के लिए सेल में सेट कर रहा हूं लेकिन काम नहीं कर रहा हूं
चांदनी

67

किसी को भी iOS 8 में इस समस्या है, तो मैंने पाया कि बस की स्थापना UITextView'sपाठ संपत्ति है, तो बुला scrollRangeToVisibleएक साथ NSRangeके साथ location:0, length:0, काम किया। मेरा पाठ दृश्य संपादन योग्य नहीं था, और मैंने चयन करने योग्य और चयन योग्य दोनों का परीक्षण किया (न तो परिणाम प्रभावित हुआ)। यहाँ एक स्विफ्ट उदाहरण है:

myTextView.text = "Text that is long enough to scroll"
myTextView.scrollRangeToVisible(NSRange(location:0, length:0))

धन्यवाद, उपरोक्त में से कोई भी मेरे लिए काम नहीं किया। आपका नमूना किया।
user1244109

यह काम करता है, लेकिन हमें एक स्क्रॉल एनीमेशन मिलता है जिसे अक्षम करने की आवश्यकता है, मैं स्क्रॉल को अक्षम करना पसंद करता हूं और @miguel की तरह फिर से सक्षम करना पसंद करता हूं
Warpzit

ऑब्जेक्टिव-सी: [myTextView स्क्रॉलरेंजटॉवी अदृश्य: NSMakeRange (0, 0)];
स्टेटफुल

यह अब काम नहीं करता है। iOS 9 और Xcode 7.3.1: /
wasimsandhu

स्विफ्ट 3 स्टाल काम करता है! :) बस इस लाइन को अपने UITextFielDelegate पद्धति में कॉपी करें। `func textViewDidEndEditing (_ textView: UITextView) {textView.scrollRangeToVanish (NSRange (स्थान: 0, लंबाई: 0))} -`
liveewithelliB

46

और यहाँ मेरा समाधान है ...

    override func viewDidLoad() {
        textView.scrollEnabled = false
        textView.text = "your text"
    }

    override func viewDidAppear(animated: Bool) {
        textView.scrollEnabled = true
    }

5
मुझे यह समाधान पसंद नहीं है, लेकिन कम से कम iOS 9 बीटा 5 के रूप में, यह केवल एक चीज है जो मेरे लिए काम करती है। मैं मान रहा हूं कि अधिकांश अन्य समाधान मान रहे हैं कि आपका पाठ दृश्य पहले से ही दिखाई दे रहा है। मेरे मामले में यह हमेशा सच नहीं होता है, इसलिए मुझे दिखाई देने के बाद तक स्क्रॉल करना अक्षम रखना होगा।
रोबोटस्पैसर

1
यही एक चीज थी जिसने मेरे लिए भी काम किया। गैर-संपादन योग्य टेक्स्टव्यू का उपयोग करते हुए iOS 9।
सीनियर

1
यह मेरे लिए काम करता है, iOS 8 नॉन-एडिटेबल टेक्स्टव्यू के साथ एट्रिब्यूटेड स्ट्रिंग। ViewWillAppear में - काम नहीं करता है
Tina Zh

मैं @robotspacer से सहमत हूं। और यह समाधान अभी भी एकमात्र है जो मेरे लिए काम करता है।
lerp90

मेरे लिए, इस समाधान ने केवल संक्षिप्त (जिम्मेदार) ग्रंथों के साथ काम किया। लंबे समय तक पाठ होने पर, UITextView स्क्रॉल बग जीवित रहता है :-) मेरा (थोड़ा बदसूरत) समाधान प्रेषण के लिए 2 सेकंड की देरी के साथ प्रेषण का उपयोग करना था। UITextView को अपने टेक्स्ट लेआउट को करने के लिए बहुत कम समय की आवश्यकता होती है ...
LaborEtArs

38

कॉलिंग

scrollRangeToVisible(NSMakeRange(0, 0))

काम करता है लेकिन इसे अंदर बुलाओ

override func viewDidAppear(animated: Bool)

4
मैं यह मानता हूं कि इसने मेरे लिए केवल viewDidAppear में काम किया।
एरिक एफ।

2
यह एकमात्र ऐसा काम है जो मेरे लिए काम करता है। धन्यवाद। लेकिन आप एनीमेशन को कैसे निष्क्रिय करते हैं जो मुझे थोड़ा कष्टप्रद लगता है?
रॉकहैमर

हालांकि यह काम करता है, मैं @Maria का समाधान बेहतर है, क्योंकि वह एक संक्षिप्त "कूद" नहीं दिखाता है।
सिपके शूर्त्रा

1
मैं अपनी अंतिम टिप्पणी वापस लेता हूं; यह मेरे लिए सबसे अच्छा जवाब है क्योंकि यह iOS 10 और iOS 11 दोनों पर काम करता है, जबकि @ मारिया का जवाब iOS 11 पर अच्छा नहीं है।
सिपके शूर्स्ट्रा

@SipkeSchoorstra, बिना किसी जंप के ( केवीओ का उपयोग करके) काम करने के लिए मेरा जवाब नीचे देखें ।
टेरी

29

मैं HTML में टेक्स्ट व्यू के साथ एट्रिब्यूटिंग स्ट्रिंग का उपयोग कर रहा था, संपादन योग्य नहीं। सामग्री ऑफसेट सेट करना मेरे लिए भी काम नहीं करता था। इसने मेरे लिए काम किया: स्क्रॉल को अक्षम कर दिया, पाठ सेट किया और फिर स्क्रॉल को फिर से सक्षम करें

[yourTextView setScrollEnabled:NO];
yourTextView.text = yourtext;
[yourTextView setScrollEnabled:YES];

मेरे पास tableViewCell के अंदर एक टेक्स्ट व्यू था। इस मामले में पाठ दृश्य लगभग अनुमानित हो गया है। 50%। यह समाधान तर्कसंगत के रूप में सरल है। धन्यवाद
जूलियन एफ। वेनर्ट

1
@ JulianF.Weinert यह iOS10 के लिए काम नहीं करता है। मेरे पास टेबुल व्यू के समान ही है। मैं textView की संपादन क्षमता का उपयोग नहीं कर रहा हूं। मुझे सिर्फ स्क्रॉल करने योग्य टेक्स्ट चाहिए। लेकिन टेक्स्टव्यू हमेशा आपके द्वारा कहे अनुसार लगभग 50% तक स्क्रॉल किया जाता है। मैंने इस पोस्ट में setContentOffset और ScrollRangeToV अदृश्य सेट करने के साथ अन्य सभी सुझावों की भी कोशिश की है। कोई काम नहीं। क्या इस काम को करने के लिए आपके पास कुछ और हो सकता है?
जेफ बी ६६

@ JeffB6688 क्षमा करें, नहीं। यह वास्तव में एक लंबे समय से पहले है ... एक "नया" आईओएस रिलीज का एक और quirk हो सकता है?
जूलियन एफ वेइनर्ट

लेकिन दुर्भाग्य से iOS 11.2 पर पूरी तरह से नहीं। Onlu @RyanTCB का उत्तर iOS 10 और iOS 11. दोनों पर काम करता है
Sipke Schoorstra

यह मेरे लिए अभी तक iOS 9, 10 और 11 पर ठीक काम करता है, लेकिन मुझे इसे ठीक करने के लिए viewDidAppearगंभीर के एक हिस्से के रूप में सक्षम करना पड़ा
MadProgrammer

19

चूंकि इन समाधानों में से किसी ने भी मेरे लिए काम नहीं किया और मैंने बहुत समय बर्बाद किया और समाधानों को एक साथ हल किया, इसने आखिरकार इसे मेरे लिए हल कर दिया।

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        let desiredOffset = CGPoint(x: 0, y: -self.textView.contentInset.top)
        self.textView.setContentOffset(desiredOffset, animated: false)
    })
}

यह वास्तव में मूर्खतापूर्ण है कि यह इस नियंत्रण के लिए डिफ़ॉल्ट व्यवहार नहीं है।

मुझे उम्मीद है कि इससे किसी और को मदद मिलेगी।


2
यह बहुत मददगार था! मुझे भी जोड़ना था: self.automaticallyAdjustsScrollViewInsets = NO; इसे पूरी तरह से काम करने के लिए देखने के लिए UITextView युक्त दृश्य।
जेन्गेल्स्मा

मैंने केवल SWIFT 3 में काम किया, self.textView.contentOffset.yइस जवाब के आधार पर एक और ऑफसेट कैल्क के साथ : stackoverflow.com/a/25366126/1736679
Efren

एक बार जब मैंने स्विफ्ट 3 के लिए नवीनतम वाक्यविन्यास के लिए मेरे लिए काम किया
hawmack13

पूरी तरह से सहमत हैं कि यह कितना पागल है? समाधान के लिए धन्यवाद
ajonno

17

मुझे यकीन नहीं है कि अगर मैं आपके प्रश्न को समझता हूं, लेकिन क्या आप केवल शीर्ष पर दृश्य स्क्रॉल करने की कोशिश कर रहे हैं? अगर ऐसा है तो आपको करना चाहिए

[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];


1
@SamStewart लिंक टूटा हुआ प्रतीत होता है, हमेशा मेरे खातों के पेज की ओर जाता है (पहले से लॉग इन किया हुआ) क्या आप इस बारे में अधिक जानकारी प्रदान कर सकते हैं कि वे किस समाधान की पेशकश करते हैं?
उलिविट

@uliwitness यह वह जगह है सुपर अब पुरानी जानकारी है, मैं एक 8 साल पुराने पोस्ट के बजाय एक और अधिक आधुनिक संसाधन की कोशिश कर की सिफारिश करेंगे। IOS API उन 8 वर्षों में नाटकीय रूप से बदल गया है।
बेंजामिन सुस्मान

1
मैंने नई जानकारी खोजने की कोशिश की है। यदि आप जानते हैं कि मुझे यह कहां मिल सकता है, तो मैं इसकी सराहना करूंगा। अभी भी एक ही मुद्दा लगता है :(
ulvitness

13

IOS 10 और स्विफ्ट 3 के लिए मैंने किया:

override func viewDidLoad() {
    super.viewDidLoad()
    textview.isScrollEnabled = false
}

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

मेरे लिए काम किया, यकीन है कि अगर आप स्विफ्ट और आईओएस के नवीनतम संस्करण के साथ समस्या नहीं कर रहे हैं।


अनुसरण करने का एक सही समाधान!
आईराग डे

मुझे UIPextView UontageViewController द्वारा नियंत्रित एक UIVextView में स्क्रॉलिंग समस्या हो रही है। (ये पृष्ठ मेरी मदद / स्क्रीन के बारे में दिखाते हैं।) आपका समाधान पहले वाले को छोड़कर प्रत्येक पृष्ठ के लिए काम करता है। किसी भी पृष्ठ पर और पहले पृष्ठ पर स्वाइप करने से उस पहले पृष्ठ की स्क्रॉल स्थिति ठीक हो जाती है। मैंने एक और .isScrollEnabled = False को व्यूविलेयर में जोड़ने की कोशिश की लेकिन इसका कोई असर नहीं हुआ। मैं इस बात पर अडिग हूं कि पहला पृष्ठ बाकी की तुलना में अलग क्यों है।
वेन हेंडरसन

[अद्यतन] बस इसे हल! .IscrollEnabled = true ट्रिगर से पहले 0.5 सेकंड की देरी का परिचय पहली लोड समस्या को ठीक करता है।
वेन हेंडरसन

बहुत अच्छा । । ।
मेसम आर

एक जादू की तरह काम किया। एकमात्र समाधान जो मेरे लिए काम करता है। आप आदमी हो।
आलसी निंजा

10

मेरे पास एक अद्यतन उत्तर है जिसमें टेक्स्टव्यू ठीक से दिखाई देगा, और उपयोगकर्ता के बिना एक स्क्रॉल एनीमेशन का अनुभव होगा।

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0))
    })

आप मुख्य कतार में क्यों कर रहे हैं, साइन व्यूवेलपरियर मेनक्यू पर चल रहा है?
कार्तिकप्रभु आलगू

1
मेरे लिए बहुत सारे चन्द्रमाओं को याद करने के लिए, लेकिन इसका पता यहां दिया गया: stackoverflow.com/a/17490329/4750649
MacInnis

8

यह इस तरह से iOS 9 रिलीज पर काम किया है ताकि स्क्रीन पर प्रदर्शित होने से पहले textView को शीर्ष पर स्क्रॉल किया जाए

- (void)viewDidLoad
{
    [super viewDidLoad];
    textView.scrollEnabled = NO;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    textView.scrollEnabled = YES;
}

1
यह चाल चली। संयोग से, इसने मुझे कुछ बहुत ही महत्वपूर्ण सिखाया: 'viewwillappear' में 'व्यू' सिर्फ self.view को संदर्भित नहीं करता है, लेकिन जाहिरा तौर पर सभी विचारों को। नहीं?
शेजाकिएन

8

मैंने ऐसा ही किया

स्विफ्ट 4:

extension UITextView {

    override open func draw(_ rect: CGRect)
    {
        super.draw(rect)
        setContentOffset(CGPoint.zero, animated: false)
    }

 }

यह एकमात्र तरीका है जो मेरे लिए सर्वोत्तम परिणाम प्रदान करता है। मैं उत्थान करता हूं।
smoothBlue

7

इसने मेरे लिए काम किया

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
      self.textView.scrollRangeToVisible(NSRange(location: 0, length: 0))
    }
  }

यह बहुत अजीब है। अधिकांश उपकरणों पर, कॉल को लपेटना DispatchQueue.main.async(...आवश्यक नहीं है, लेकिन किसी कारण से, (जैसे) iPhone 5s (iOS 12.1) यह तब तक काम नहीं करता है जब तक आप डिस्पैच नहीं करते हैं। लेकिन जैसा कि डिबगर पर कॉल स्टैक द्वारा रिपोर्ट किया गया है, viewWillAppear() पहले से ही सभी मामलों में मुख्य कतार पर चल रहा है ... - WTF, Apple ???
निकोलस मियारी

2
मैं यह भी सोच रहा था कि मुझे मुख्य कतार पर स्पष्ट रूप से प्रेषण करना है, भले ही मैं मुख्य कतार में सभी घटनाओं को चला रहा हूं। लेकिन इसने मेरे लिए काम किया
अंकित ने

6

कर्सर को पाठ के शीर्ष पर ले जाने के लिए यह प्रयास करें।

NSRange r  = {0,0};
[yourTextView setSelectedRange:r];

देखें कि कैसे जाता है। सुनिश्चित करें कि आप अपने सभी घटनाओं को निकाल दिया है या आप जो भी कर रहे हैं उसे पूरा करने के बाद इसे कॉल करें।


यह आदमी की कोशिश की, भाग्य नहीं। ऐसा लगता है कि FirstResponder के साथ कुछ है। कोई अन्य सुझाव?
सैम स्टीवर्ट

कर्सर की स्थिति के साथ भी यही समस्या है, इसने मेरे लिए काम किया ... इसके लिए महान +1।
धवल

मुझे नीचे से ऊपर तक एनीमेशन मिल रहा है, लेकिन मुझे इसकी आवश्यकता नहीं है कि इसे कैसे हटाया जाए।
धवल

2
यह शीर्ष पर स्क्रॉल नहीं करता है (कुछ पिक्सेल पर कम)।
दिमित्री

6

मेरा मुद्दा यह है कि जब दृश्य दिखाई दे तो स्क्रॉल करने के लिए textView सेट करें। IOS 10.3.2 के लिए, और स्विफ्ट 3।

समाधान 1:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // It doesn't work. Very strange.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // It works, but with an animation effection.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

समाधान 2:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // It works.       
    self.textView.contentOffset = CGPoint.zero
}

5

पिछले उत्तरों को मिला दिया, अब यह काम करना चाहिए:

talePageText.scrollEnabled = false
talePageText.textColor = UIColor.blackColor()
talePageText.font = UIFont(name: "Bradley Hand", size: 24.0)
talePageText.contentOffset = CGPointZero
talePageText.scrollRangeToVisible(NSRange(location:0, length:0))
talePageText.scrollEnabled = true

केवल एक चीज है कि मेरे लिए काम कैसे मूर्खतापूर्ण है। मैं scrollRangeToVisibleहालांकि निकालने में सक्षम था ।
जॉर्डन एच

आपको NSRangeRange (0,0) के साथ NSRange (0,0)
RobP


5

बस आप इस कोड का उपयोग कर सकते हैं

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.scrollRangeToVisible(NSMakeRange(0, 0))
}

4

स्विफ्ट 2 उत्तर:

textView.scrollEnabled = false

/* Set the content of your textView here */

textView.scrollEnabled = true

यह टेक्स्ट व्यू को सेट करने के बाद टेक्स्ट के अंत तक स्क्रॉल करने से रोकता है।


4

स्विफ्ट 3 में:

  • viewWillLayoutSubviews बदलाव करने की जगह है। viewWillAppear के रूप में अच्छी तरह से काम करना चाहिए, लेकिन तार्किक रूप से, viewWillLayoutSubviews में लेआउट प्रदर्शन किया जाना चाहिए ।

  • तरीकों के बारे में, दोनों scrollRangeToVisible और setContentOffset काम करेंगे। हालाँकि, setContentOffset एनिमेशन को बंद या चालू रखने की अनुमति देता है।

मान लें UITextView के रूप में नामित किया गया है yourUITextView । यहाँ कोड है:

// Connects to the TextView in the interface builder.
@IBOutlet weak var yourUITextView: UITextView!

/// Overrides the viewWillLayoutSubviews of the super class.
override func viewWillLayoutSubviews() {

    // Ensures the super class is happy.
    super.viewWillLayoutSubviews()

    // Option 1:
    // Scrolls to a range of text, (0,0) in this very case, animated.
    yourUITextView.scrollRangeToVisible(NSRange(location: 0, length: 0))

    // Option 2:
    // Sets the offset directly, optional animation.
    yourUITextView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}

viewWillLayoutSubviews किसी भी view resize पर कहा जाता है। आमतौर पर वह नहीं होता जो आप चाहते हैं।
11

4

मुझे निम्नलिखित अंदर देखने के लिए कॉल करना था। वीडियो साक्षात्कार ( अंदर देखने के लिए कॉल करना बहुत जल्दी था):

    myTextView.setContentOffset(.zero, animated: true)

हर परिदृश्य में काम नहीं करता है
राजा साद

3

इसने मेरे लिए काम किया। यह रेयानटीसीबी के उत्तर पर आधारित है लेकिन यह एक ही समाधान का उद्देश्य-सी संस्करण है:

- (void) viewWillAppear:(BOOL)animated {
    // For some reason the text view, which is a scroll view, did scroll to the end of the text which seems to hide the imprint etc at the beginning of the text.
    // On some devices it is not obvious that there is more text when the user scrolls up.
    // Therefore we need to scroll textView to the top.
    [self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
}

3
-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    [textview setContentOffset:CGPointZero animated:NO];
}

viewWillLayoutSubviews किसी भी view resize पर कहा जाता है। आमतौर पर वह नहीं होता जो आप चाहते हैं।
11

3
-(void) viewDidAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}

- (void)viewWillAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}
  • ViewWillappearउपयोगकर्ता नोटिस करने से पहले इसे तुरंत करेगा, लेकिन ViewDidDisappearअनुभाग इसे आलसी रूप से चेतन करेगा।
  • [mytextView setContentOffset:CGPointZero animated:YES]; कभी-कभी काम नहीं करता है (मुझे नहीं पता क्यों), इसलिए स्क्रॉलरगेटोविजिव का उपयोग करें।

3

समस्या हल: iOS = 10.2 स्विफ्ट 3 UITextView

मैंने निम्नलिखित लाइन का उपयोग किया:

displayText.contentOffset.y = 0

1
काम किया (iOS 10.3)! मैंने इसे अंदर जोड़ा viewDidLayoutSubviewsइसलिए ऐसा तब होता है जब स्क्रीन घूमती है। अन्यथा सामग्री ऑफसेट गलत हो जाती है।
पुप

2
[self.textView scrollRectToVisible:CGRectMake(0, 0, 320, self.textView.frame.size.height) animated:NO];

कृपया अधिक विवरण के साथ संपादित करें।
योजनाबद्ध

2

मुझे समस्या थी, लेकिन मेरे मामले में टेक्स्टव्यू कुछ कस्टम व्यू का सबव्यू है और इसे व्यूकंट्रोलर में जोड़ दिया। कोई भी हल मेरे लिए काम नहीं आया। समस्या को हल करने के लिए 0.1 सेकंड की देरी और फिर स्क्रॉल सक्षम किया गया। इसने मेरे लिए काम किया।

textView.isScrollEnabled = false
..
textView.text = // set your text here

let dispatchTime = DispatchTime.now() + 0.1
DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
   self.textView.isScrollEnabled = true
}

1

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

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

    //this part of code scrolls to top
    textView.contentOffset.y = -64
    textView.scrollEnabled = false
    textView.layoutIfNeeded() //if don't work, try to delete this line
    textView.scrollEnabled = true

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

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

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


1

IOS 9 में मेरे लिए यह विधि स्क्रॉल के साथ जिम्मेदार स्ट्रिंग के साथ मेरे लिए काम करना बंद कर दिया है

इसलिए मुझे इसका उपयोग करना पड़ा:

textViewMain.attributedText = attributedString
textViewMain.scrollRangeToVisible(NSRange(location:0, length:0))
delay(0.0, closure: { 
                self.textViewMain.scrollRectToVisible(CGRectMake(0, 0, 10, 10), animated: false)
            })

देरी कहाँ है:

func delay(delay:Double, closure:()->Void) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

1

इस 2 लाइनों के समाधान का उपयोग करने का प्रयास करें:

view.layoutIfNeeded()
textView.contentOffset = CGPointMake(textView.contentInset.left, textView.contentInset.top)

इसने मेरे लिए काम किया। मेरा UITextView एक UICollectionVewCell के अंदर था। मुझे संदेह है कि जब तक लेआउट की गणना ठीक से नहीं की जाती है, तब तक स्क्रॉलरेंजटविविज़ुअल स्क्रॉल गलत स्थान पर पहुंच जाता है
जॉन फाउलर

1

यहाँ मेरे कोड हैं। यह बढ़िया काम करता है।

class MyViewController: ... 
{
  private offsetY: CGFloat = 0
  @IBOutlet weak var textView: UITextView!
  ...

  override viewWillAppear(...) 
  {
      ...
      offsetY = self.textView.contentOffset.y
      ...
  }
  ...
  func refreshView() {
      let offSetY = textView.contentOffset.y
      self.textView.setContentOffset(CGPoint(x:0, y:0), animated: true)
      DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        [unowned self] in
        self.textView.setContentOffset(CGPoint(x:0, y:self.offSetY), 
           animated: true)
        self.textView.setNeedsDisplay()
      }
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.