2011-08-23 13 views
5

मैं एक UIScrollView जो एक बटन शामिल है। जब बटन दबाया जाता है, तो मैं scrollRectToVisible का उपयोग करके दृश्य के नीचे स्क्रॉल करना चाहता हूं।UIScrollView ScrollRectToVisible - चेतन के साथ काम नहीं कर = हाँ

जैसे:

  • मूल रूप से, कुछ नहीं होता:

    CGRect r = CGRectMake(0, myUIScrollView.contentSize.height - 1, 1, 1); 
    [myUIScrollView scrollRectToVisible:r animated:YES]; 
    

    अगर मैं नहीं करने के लिए एनिमेटेड सेट, सब कुछ उम्मीद से काम करता है के रूप में, लेकिन अगर मैं इसे हाँ करने के लिए सेट, मैं वास्तव में अजीब व्यवहार देख ।

  • अगर मैं बटन बार-बार टैप करते हैं, यह एक जोड़े पिक्सल, स्क्रॉल कर सकते हैं या सभी तरह स्क्रॉल कर सकते हैं।
  • लेकिन मैं बटन, यह नीचे की उम्मीद के रूप में करने के लिए स्क्रॉल का एक मौका है दबाने से पहले एक उंगली से मैन्युअल रूप से देखने के लिए स्क्रॉल, लेकिन यह एक यकीन है कि बात नहीं है यदि।

मैंने _geScroll_Settings.contentSize मुद्रित किया है, और यह अपेक्षा की जाती है।

मैं भी एक टाइमर शुरू करने से scrollRectToVisible करने के लिए कॉल में देरी करने की कोशिश की है, लेकिन परिणाम काफी समान हैं।

स्क्रॉल व्यू काफी वेनिला है। मैं इसे इंटरफ़ेस बिल्डर में बना रहा हूं। मैं गतिशील रूप से scrollup की सामग्री को स्टार्टअप पर जोड़ रहा हूं, और इसकी सामग्री को समायोजित कर रहा हूं उचित रूप से आकार बदलें, लेकिन जो कुछ ठीक काम कर रहा है।

कोई विचार?

+0

इस समझ नहीं किया है, लेकिन मैं इसे किया जाना है, तो मैं बस जब तक यह सही जगह पर है एक टाइमर अपने आप शुरू कर दिया और यह स्क्रॉल, setContentOffset का उपयोग कर w/एनिमेटेड: NO। काम करता है लेकिन :( –

उत्तर

5

मेरे शर्त है कि scrollRectToVisible बाहर crapping है, क्योंकि दृश्य क्षेत्र वैध (1x1) नहीं है, या y ऑफसेट सिर्फ सीमा के बाहर है, है आप scrollview के दृश्य क्षेत्र के आकार के साथ इसे स्थापित करने की कोशिश की बजाय?

CGRect rectBottom = CGRectZero; 
rectBottom.size = myUIScrollView.frame.size; 
rectBottom.origin.y = myUIScrollView.contentSize.height - rectBottom.size.height; 
rectBottom.origin.x = 0; 

[myUIScrollView scrollRectToVisible:rectBottom animated:YES]; 

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

+0

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

+0

बस आपको वापस मिल रहा है यह - मैंने कोशिश की और कोई किस्मत नहीं। आखिर में मैंने 'एनिमेटेड: नो' और टाइमर का उपयोग कर इसे एनिमेट कर दिया। –

+0

मैंने अभी इसमें भाग लिया है। लगभग 2 घंटे सबकुछ देख रहे हैं * लेकिन * scrollRectToVisible कॉल। –

0

मैं "अगर मैं नहीं करने के लिए एनिमेटेड सेट, सब कुछ काम करता है के रूप में उम्मीद" भाग सहित एक ऐसी ही समस्या का सामना करना पड़ा।

यह पता चला कि IOS 6 पर UITextView ऑटो स्क्रॉल अपने निकटतम माता पिता UIScrollView कर्सर दृश्यमान बनाने के लिए जब वह पहली बार प्रत्युत्तर हो जाता है। आईओएस 7 पर ऐसा कोई व्यवहार नहीं है। UIScrollView एक ही समय में scrollRectToVisible स्क्रॉल करने के लिए दो कॉलों से उलझन में प्रतीत होता है।

आईओएस 6 पर स्क्रॉल करने के लिए मेरी स्पष्ट कॉल स्क्रूटेक्विबल को अधिकांश समय अनदेखा किया जाता है। यह केवल यूआईटीएक्स्टव्यू दृश्य (ऑटो स्क्रॉल) की पहली पंक्ति बनाने के लिए स्क्रॉल करेगा और आईओएस 7 पर पूरी चीज नहीं करेगा।

इसका परीक्षण करने के लिए, एक्सकोड 5 में एक नया एकल दृश्य ऐप बनाएं, इसे सेट करें 6.0 पर तैनाती लक्ष्य और ViewController.m के लिए नीचे दिए गए कोड का उपयोग करें। इसे आईओएस 6.1 सिम्युलेटर में चलाएं, UITextView को छिपाने के लिए स्क्रॉल करें और स्क्रीन पर कहीं भी टैप करें। आपको इसे कुछ बार पुनः प्रयास करना पड़ सकता है, लेकिन ज्यादातर मामलों में यह केवल पहली पंक्ति दिखाई देगा।यदि आप वर्कअर्ड परिभाषित करते हैं तो UITextView को अपने स्वयं के UIScrollView में एम्बेड किया जाता है और स्क्रॉल करने के लिए कॉल की आवश्यकता होती है।

#import "ViewController.h" 

//#define WORKAROUND 

@interface ViewController() 
@property (nonatomic, strong) UIScrollView *scrollView; 
@property (nonatomic, strong) UITextView *textView; 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTap)]]; 

    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)]; 
    self.scrollView.contentSize = CGSizeMake(320, 400); 
    self.scrollView.backgroundColor = [UIColor lightGrayColor]; 
    [self.view addSubview:self.scrollView]; 

#ifdef WORKAROUND 
    UIScrollView* dummyScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)]; 
    self.textView = [[UITextView alloc] initWithFrame:dummyScrollView.bounds]; 
    [dummyScrollView addSubview:self.textView]; 
    [self.scrollView addSubview:dummyScrollView]; 
#else 
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)]; 
    [self.scrollView addSubview:self.textView]; 
#endif 

    self.textView.backgroundColor = [UIColor grayColor]; 

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

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)viewTap 
{ 
    if (self.textView.isFirstResponder) { 
     [self.textView resignFirstResponder]; 
    } 
    else { 
     [self.textView becomeFirstResponder]; 
    } 
} 

- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
#ifdef WORKAROUND 
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.superview.frame, 0, -10) animated:YES]; 
#else 
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.frame, 0, -10) animated:YES]; 
#endif 
} 

@end 
संबंधित मुद्दे