2013-10-25 10 views
14

मुझे topLayoutGuide विधि के साथ अजीब समस्याएं हैं, जिन्हें मुझे ऐसी स्थिति में उपयोग करना है जहां setAutomaticallyAdjustsScrollViewInsets: काम नहीं करता है। समस्या के कारण को कम करने के लिए, मैंने निम्न न्यूनतम उदाहरण बनाया है, जो परीक्षण के लिए केवल मूल तालिका दृश्य सेट करता है:कॉलिंग टॉपलाउटगाइड पूरी तरह से स्क्रॉलिंग तोड़ता है?

  1. एक्सकोड में एक नया आईओएस सिंगल व्यू एप्लिकेशन सेट अप करें।
  2. ViewController.m के क्रियान्वयन में निम्नलिखित कोड पेस्ट करें:

    @implementation ViewController 
    
    - (void)loadView 
    { 
        [self setTableView:[[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]]; 
    } 
    
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        [self setAutomaticallyAdjustsScrollViewInsets:NO]; // [*] 
    } 
    
    - (void)viewDidLayoutSubviews 
    { 
        UITableView *tableView = [self tableView]; 
    
        UIEdgeInsets insets = [tableView contentInset]; 
        // insets.top = [[self topLayoutGuide] length]; // [1] 
        // insets.top = 100;       // [2] 
    
        [tableView setContentInset:insets]; 
        [tableView setScrollIndicatorInsets:insets]; 
    } 
    
    #pragma mark - Table view data source 
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
        return 100; 
    } 
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        static NSString *CellIdentifier = @"Cell"; 
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    
        if (cell == nil) { 
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
        } 
    
        [[cell textLabel] setText:[NSString stringWithFormat:@"%d", [indexPath row]]]; 
    
        return cell; 
    } 
    
    @end 
    

मुद्दों है कि मैं आ रही हैं ये हैं:

  1. अगर मैं लाइन [1] के साथ चिह्नित uncomment, सही इन्सेट लागू किया गया है, लेकिन तालिका दृश्य को स्क्रॉल करना अब काम नहीं करता है। जब मैं स्क्रॉल करने का प्रयास करता हूं, तो मेरी उंगली छोड़ने के बाद तालिका केवल प्रारंभिक स्क्रॉल स्थिति पर वापस आती है। यह व्यवहार कुछ भी परिणाम देने के बिना [self topLayoutGuide] पर एक सादा कॉल द्वारा ट्रिगर किया जाता है।

  2. अगर मैं लाइन [2]बजाय [1] की uncomment, स्क्रॉल काम करता है। 100 पीटी का इन्सेट भी लागू होता है। लेकिन अब प्रारंभिक स्क्रॉलिंग स्थिति स्वचालित रूप से समायोजित की जाती है ताकि सामग्री स्टेटस बार को ओवरलैप कर दे।

([*]: यह वास्तव में केवल एक युक्त नेविगेशन नियंत्रक के साथ संयोजन में कुछ भी करने के लिए लगता है मैं इस उदाहरण में एक फर्क प्रतीत नहीं होता है, लेकिन मैं बस सुनिश्चित करने के लिए किसी भी स्वत: व्यवहार को निष्क्रिय करना चाहते। ।)

क्या कुछ स्पष्ट है कि मैं गलत कर रहा हूं? मैं वास्तव में यहाँ एक नुकसान में हूँ।

+4

मैं सिर्फ पता चला कि 'करने के लिए कॉल [आत्म topLayoutGuide]' तालिका दृश्य के 'contentSize' संपत्ति से बदलने के लिए कारण बनता है '{0, 0}' के लिए सही मान। कोई विचार नहीं कि यह क्यों हो रहा है, हालांकि ... – tajmahal

+2

शायद एक बग, वह भी है। – cschwarz

+2

वही बात यहाँ। यह अविश्वसनीय रूप से निराशाजनक है। अच्छा पुराना आईओएस 3.0 बार लगता है। – Nicky

उत्तर

11

यह निश्चित रूप से आईओएस 7 में एक बग है (7.1 में तय नहीं होता है) लेकिन ऐसा लगता है कि केवल UITableViewControllers को प्रभावित करता है। मैंने एक UIViewController को एक एम्बेडेड UITableView के साथ उपयोग करने के लिए स्विच किया क्योंकि मैं स्थिर कोशिकाओं का उपयोग नहीं कर रहा हूं और UITableViewController आपको किसी भी 'जादू' की आवश्यकता नहीं है।

एक बार मैंने UITableViewDataSource और UITableViewDelegate मैन्युअल रूप से वायर्ड किया था, तो मैं तालिका को गड़बड़ किए बिना self.topLayoutGuide का उपयोग शुरू करने में सक्षम था। दृश्य सामग्री आकार।

जब तक ऐप्पल बग को ठीक नहीं करता तब तक यह मेरे लिए एक स्वीकार्य कामकाज था। बजाय topLayoutGuide होने का मेरे लिए

2

यही बात,, इस प्रयास करें:

CGFloat topOffset = CGRectGetMaxY(self.refController.navigationController.navigationBar.frame); 
संबंधित मुद्दे