2009-07-24 6 views
28

मेरे पास UITableViewCell में UITextView शामिल है। विचारों को प्रारंभ में प्रदर्शित होने पर लेआउट सही होता है, लेकिन एक बार जब मैं UITextView पर क्लिक करता हूं तो यह स्वचालित रूप से थोड़ा सा स्क्रॉल करता है और पहली पंक्ति पर वर्णों का शीर्ष आधा अदृश्य हो जाता है।
UITextView not active http://gerodt.homeip.net/uitextview-notactive.pngइसे दर्ज करते समय स्क्रॉलिंग से UITextView को कैसे रोकें

और यह एक है जब मैं UITextView में क्लिक इसे सक्रिय बनाने के लिए:
UITextView active http://gerodt.homeip.net/uitextview-active.png

मैं UITextView स्क्रॉल करने के लिए नहीं है

इस छवि को जब UITextView सक्रिय नहीं है बिल्कुल, यह तय रहने के लिए सरल होना चाहिए। इसे कैसे प्राप्त किया जा सकता है? मैंने पहले से ही Interface Builder में कई सेटिंग्स की कोशिश की है, लेकिन अब तक कोई भाग्य नहीं है।

किसी भी सुझाव की सराहना की जाती है।

Gero

+0

एसडीके का कौन सा संस्करण आप उपयोग कर रहे हैं? 3.0? – hanleyp

+0

हां, मैं एसडीके 3.0 – Gero

उत्तर

16

यह व्यवहार कैसे UITextView एप्पल के इंजीनियर के अनुसार इस का इरादा है और UITextView पाठ कि कम से कम ऊंचाई की कुछ पंक्तियों में हैं के लिए है है। इसके आसपास कोई काम नहीं है, इसके बजाय UITextField का उपयोग करें या अपनी UITextView को ऊंचाई में कम से कम 3 पंक्तियों में बढ़ाएं।

+1

धन्यवाद का उपयोग कर रहा हूं। मैंने उच्च से 55 तक बढ़ाया और 12 के फोंटिज़ के साथ अब यह काम करता है जैसा मैं चाहता हूं। – Gero

61

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

कामकाज/समाधान सरल है: subclass UITextView और सामग्री को ओवरराइड करेंसेट विधि ताकि यह हमेशा UIEdgeInsetZero लौटा सके। इस प्रयास करें:

// 
// BCTextView 
// 
// UITextView seems to automatically be resetting the contentInset 
// bottom margin to 32.0f, causing strange scroll behavior in our small 
// textView. Maybe there is a setting for this, but it seems like odd behavior. 
// override contentInset to always be zero. 
// 
@interface BCZeroEdgeTextView : UITextView 
@end 

@implementation BCZeroEdgeTextView 

- (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; } 

@end 
+0

धन्यवाद, मेरे लिए बहुत अच्छा काम करता है। – Ievgen

+1

और मैं, बस जो मैं खोज रहा था। –

+0

आप डी आदमी हैं !!!! धन्यवाद!!!!!!!!!! – SpaceDog

1

मैं अवांछित UITextView स्क्रॉल के साथ एक समान समस्या का सामना कर रहा था। मैं अंत में तुम भी तो की तरह, कीबोर्ड अधिसूचना के लिए रजिस्टर करने की आवश्यकता होगी मेरी keyboardDidShow:

- (void)keyboardDidShow:(NSNotification *)notification { 
    textView.contentSize = CGSizeZero; 
} 

के अंत में contentSize रीसेट करके इसे ठीक करने में कामयाब रहे:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 

मेरे मामले में मैं नहीं था ' मैं स्क्रॉलिंग चाहता हूं क्योंकि मैं फ्रेम को 0Vकी ऊंचाई पर फ्रेम रीसेट कर रहा था, जब textViewDidChange (UIScrollView के अंदर बढ़ते टेक्स्टव्यू)।

6

आप, साथ ही कर सकते हैं:

textView.contentInset=UIEdgeInsetsZero; 

आपका प्रतिनिधि फ़ाइल में।

+1

यह बहुत अच्छा काम करता है! –

0

स्केल टू फिल के बजाय टेक्स्टव्यू पर रेड्रा डालने का प्रयास करें। आपको अभी भी प्रतिनिधि को कैप्चर करना होगा और सामग्री को ऑफ़सेट रखना होगा, लेकिन कम से कम कूद को इंगित करना चाहिए (0,0)। इसके अलावा उपरोक्त सबव्यूज़ बंद होना चाहिए। यह हर बार मेरे बारे में टेक्स्टव्यू के शीर्ष पर कूद रहा था और इससे समस्या हल हो गई।

enter image description here

2

UITextViewUIScrollView का एक उपवर्ग है, इसलिए जवाब contentOffset संपत्ति है, जो क्या बदला जा रहा है, सन्निवेश वाली नहीं या सामग्री आकार है शामिल है। यदि पहली बार दृश्य दिखाई देने पर स्क्रॉल स्थिति सही होती है, तो आप बाद में याद करने के लिए सामग्री ऑफ़सेट स्टोर कर सकते हैं।

YourViewController.h कतरना

@interface YourViewController : UIViewController <UITextViewDelegate, UIScrollViewDelegate> 

@property(nonatomic, weak) IBOutlet UITextView *textView; 

@end 

YourViewController.m झलकी

@implementation YourViewController { 
@private 
    BOOL _freezeScrolling; 
    CGFloat _lastContentOffsetY; 
} 

// UITextViewDelegate 
- (void)textViewDidBeginEditing:(UITextView *)textView { 
    // tell the view to hold the scrolling 
    _freezeScrolling = YES; 
    _lastContentOffsetY = self.textView.contentOffset.y; 
} 

// UITextViewDelegate 
- (void)textViewDidEndEditing:(UITextView *)textView { 
    _freezeScrolling = NO; 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (_freezeScrolling) { 
     // prevent the scroll view from actually scrolling when we don't want it to 
     [self repositionScrollView:scrollView newOffset:CGPointMake(scrollView.contentOffset.x, _lastContentOffsetY)]; 
    } 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    // scroll prevention should only be a given scroll event and turned back off afterward 
    _freezeScrolling = NO; 
} 

// UIScrollViewDelegate 
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    // when the layout is redrawn, scrolling animates. this ensures that we are freeing the view to scroll 
    _freezeScrolling = NO; 
} 

/** 
This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method. 
*/ 
- (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset { 
    CGRect scrollBounds = scrollView.bounds; 
    scrollBounds.origin = offset; 
    scrollView.bounds = scrollBounds; 
} 

क्या भी कोड नमूने में ध्यान देना महत्वपूर्ण है के ऊपर अंतिम विधि है। किसी भी प्रकार के setContentOffset: को कॉल करना वास्तव में स्क्रॉलिंग ट्रिगर करेगा, जिसके परिणामस्वरूप scrollViewDidScroll: पर कॉल किया जाएगा। तो setContentOffset: पर कॉल करना एक अनंत लूप में परिणाम देता है। स्क्रॉल सीमा निर्धारित करना इसके लिए कामकाज है।

संक्षेप में, हम दृश्य नियंत्रक को स्क्रॉलिंग से UITextView को रोकने के लिए बताते हैं जब हम पाते हैं कि उपयोगकर्ता ने संपादन के लिए टेक्स्ट चुना है। हम वर्तमान सामग्री ऑफ़सेट भी स्टोर करते हैं (क्योंकि हम जानते हैं कि स्थिति वह है जो हम चाहते हैं)। यदि UITextView स्क्रॉल करने का प्रयास करता है, तो स्क्रॉल बंद होने तक सामग्री को ऑफसेट होने पर हम scrollViewDidEndDecelerating: या scrollViewDidEndScrollingAnimation: ट्रिगर करते हैं)। जब उपयोगकर्ता संपादन कर लेता है तो हम स्क्रॉलिंग को भी अनफ्रीज़ करते हैं।

याद रखें, यह एक मूल उदाहरण है, इसलिए आपको इच्छित सटीक व्यवहार के आधार पर कोड को ट्विक करने की आवश्यकता होगी।