2012-10-16 10 views
6

मैंने एक UITableView बनाया है जिसे मैं अपने अर्ध-पारदर्शी ब्लैक स्टेटस बार के नीचे स्क्रॉल करना चाहता हूं। मेरे एक्सआईबी में, मैंने टेबल व्यू की वाई स्थिति को -20 पर सेट किया है और यह सब ठीक दिखता है।UIRefreshControl के साथ UITefreshControl अर्द्ध पारदर्शी स्टेटस बार

अब, मैंने अभी-अभी एक आईओएस 6 यूआईआरफ्रेश कंट्रोल को ताज़ा करने के लिए जोड़ा है जो -20 वाई स्थिति की वजह से काम करता है, यह स्टेटस बार के पीछे से गिरता है। मैं चाहता हूं कि यह पीछे की बजाय स्टेटस बार के नीचे "विस्तारित" स्थिति हो।

यह समझ में आता है कि यह गड़बड़ क्यों कर रहा है लेकिन ऐसा लगता है कि इसके फ्रेम को बदलने में कोई फर्क नहीं पड़ता है और टेबलव्यू की सामग्री इन्सेट इत्यादि कोई फर्क नहीं पड़ता है।

दस्तावेज़ बताते हैं कि एक बार रीफ्रेश नियंत्रण स्थापित हो जाने पर, UITableViewController तब से इसकी स्थिति का ख्याल रखता है।

कोई विचार?

उत्तर

0

UIRefreshControl हमेशा आपके UITableView में सामग्री के ऊपर बैठता है। यदि आपको रीफ्रेश कंट्रोल कहां स्थानांतरित करने की आवश्यकता है, तो तालिका दृश्य को शीर्ष contentInset में बदलने का प्रयास करें। UIRefreshControl यह निर्धारित करते समय इसे ध्यान में रखता है कि इसे कहां रखा जाना चाहिए।

+0

हाँ मुझे लगता है कि कोशिश की। यह केवल सामग्री को प्रभावित करता है, ताज़ा नियंत्रण नहीं :( – NonatomicRetain

+0

यहां एक ही समस्या है मेरे यूआईटीबल व्यू में एक इंसेट UIEdgeInsets इंसेट = UIEdgeInsetsMake (37, 0, 0, 0); tblAccounts।contentInset = inset; लेकिन रीफ्रेश कंट्रोल इंसेट को अनदेखा करता है – Andy

4

बस UIRefreshControl उपवर्ग और ओवरराइड इस तरह layoutSubviews:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + 20; 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

यह कोड इस तथ्य को ध्यान में रखता है कि 'UIRefreshControl' चल रहा है और विस्तार कर रहा है, केवल स्क्रॉल व्यू के साथ नहीं चल रहा है। –

+0

मैंने खाते में प्रारंभिक 'खींचने' को लेने के लिए कुछ कोड जोड़ा, अब यह अच्छी तरह से दिखाई देगा जैसा कि यह होना चाहिए :)। –

0

इस प्रयास करें:

CGFloat offset = 44; 
for (UIView *subview in [self subviews]) { 
    if ([subview isKindOfClass:NSClassFromString(@"_UIRefreshControlDefaultContentView")]) { 
     NSLog(@"Setting offset!"); 
     [subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y + offset, subview.frame.size.width, subview.frame.size.height)]; 
    } 
} 

यह UIRefreshControll 44 अंक के लिए नीचे की ओर जाएगा;

9

तुम इतनी तरह UIRefreshControl उपवर्ग कर सकते हैं और लागू layoutSubviews:

@implementation RefreshControl { 
    CGFloat topContentInset; 
    BOOL topContentInsetSaved; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // getting containing scrollView 
    UIScrollView *scrollView = (UIScrollView *)self.superview; 

    // saving present top contentInset, because it can be changed by refresh control 
    if (!topContentInsetSaved) { 
     topContentInset = scrollView.contentInset.top; 
     topContentInsetSaved = YES; 
    } 

    // saving own frame, that will be modified 
    CGRect newFrame = self.frame; 

    // if refresh control is fully or partially behind UINavigationBar 
    if (scrollView.contentOffset.y + topContentInset > -newFrame.size.height) { 
     // moving it with the rest of the content 
     newFrame.origin.y = -newFrame.size.height; 

    // if refresh control fully appeared 
    } else { 
     // keeping it at the same place 
     newFrame.origin.y = scrollView.contentOffset.y + topContentInset; 
    } 

    // applying new frame to the refresh control 
    self.frame = newFrame; 
} 

यह tableView के contentInset ध्यान में रखा जाता है, लेकिन आप बदल सकते हैं topContentInset चर करने के लिए आप जो भी मान की जरूरत है और यह बाकी संभाल लेंगे।

मुझे उम्मीद है कि कोड यह समझने के लिए पर्याप्त दस्तावेज है कि यह कैसे काम करता है।

+0

एक आकर्षण की तरह काम करता है। धन्यवाद एंथनी! – George

1

current upvoted answer इस तथ्य को अच्छी तरह से नहीं चलाता है कि आप घटक को नीचे खींचते हैं (जैसे एंथनी दिमित्रीयेव ने बताया) ऑफसेट गलत है। अंतिम भाग इसे ठीक करना है।

किसी भी तरह से:

- (void)layoutSubviews 
{ 
    UIScrollView* parentScrollView = (UIScrollView*)[self superview]; 
    CGFloat extraOffset = parentScrollView.contentInset.top; 

    CGSize viewSize = parentScrollView.frame.size; 

    if (parentScrollView.contentInset.top + parentScrollView.contentOffset.y == 0 && !self.refreshing) { 
     self.hidden = YES; 
    } else { 
     self.hidden = NO; 
    } 

    CGFloat y = parentScrollView.contentOffset.y + parentScrollView.scrollIndicatorInsets.top + extraOffset; 

    if(y > -60 && !self.isRefreshing){ 
     y = -60; 
    }else if(self.isRefreshing && y <30) 
    { 
     y = y-60; 
    } 
    else if(self.isRefreshing && y >=30) 
    { 
     y = (y-30) -y; 
    } 

    self.frame = CGRectMake(0, y, viewSize.width, viewSize.height); 

    [super layoutSubviews]; 
} 
+0

आप कोड की इस पंक्ति को क्यों लिखते हैं y = (y-30) -y; ब्रैकेट खोलने के बाद यह y = 30 होगा; जैसा कि समझ में आता है यह y = y - 30 होना चाहिए –

0

मैं अन्य उत्तर में layoutsubviews का अधिभावी पाया था और अधिक से अधिक फ्रेम बदलने के लिए, वे भी व्यवहार को बदलने (नियंत्रण फिसलने शुरू किया: निम्न विधि के साथ UIRefreshControl उपवर्ग सामग्री के साथ नीचे)। फ्रेम नहीं बल्कि व्यवहार मैं ऐसा किया बदलने के लिए:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGRect frame = self.frame; 
    CGFloat desiredYOffset = 50.0f; 
    self.frame = CGRectMake(frame.origin.x, frame.origin.y + desiredYOffset, frame.size.width, frame.size.height); 

}

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