2009-06-20 14 views
21

यदि आपके पास एक पंक्ति के साथ एक सादा (समूहबद्ध नहीं) UITableView है, तो शेष स्क्रीन रिक्त या खाली कोशिकाओं से भरी हुई है। आप इन खाली कोशिकाओं की उपस्थिति को कैसे बदलते हैं? पहले सबसे पहले, मैंने सोचा था कि उनके पास तालिका दृश्य में उपयोग किए जाने वाले सेल की उपस्थिति होगी लेकिन ऐसा लगता है कि वे नहीं करते हैं।मैं सादे UITableView में 'रिक्त' कक्षों की उपस्थिति को कैसे संशोधित कर सकता हूं?

संवर्धित संहिता (चीजें) के लोगों ने इन कोशिकाओं को संशोधित करने के लिए एक अच्छा काम किया है, लेकिन मैं तुरंत उनकी उपस्थिति को बदलने का तरीका नहीं सोच सकता।

कोई सुझाव?

+0

* टक्कर * एक समाधान है कि काम करता है मिल गया? कृपया यहां साझा करें। धन्यवाद – lostInTransit

+0

मैंने अभी तक जो किया है वह तालिका दृश्य के अंत में एक 'अदृश्य' सेल जोड़ता है जिसमें एक छविदृश्य है जो तालिका दृश्य के अंत की छाया प्रदर्शित करता है। मैंने विभाजक शैली को किसी को भी सेट नहीं किया है। यह एक समान प्रभाव बनाता है लेकिन मुझे इसके साथ खुश होने के लिए थोड़ा और ट्विक करना होगा। –

उत्तर

20

हालांकि यह नहीं है आप के लिए काफी क्या खोज रहे हैं, आप भी यह सिर्फ मेज पर एक पाद लेख दृश्य स्थापना करके एक खाली क्षेत्र (खाली कोशिकाओं के बजाय) प्रदर्शित करने के लिए बदल सकते हैं। ऊंचाई 0 का एक UIView चाल करेगा।

+1

आपकी मदद से, मैंने इसे समझ लिया और यह काफी आसान है। वांछित UIImageView को UITableView के फुटेज में जोड़ें (जैसा कि आपने सुझाव दिया है) लेकिन तालिका दृश्य सही तरीके से व्यवहार करने के लिए आपको UIImageView की ऊंचाई के साथ अपनी ऊंचाई बढ़ाने की आवश्यकता है। इस तरह, तालिका दृश्य सामान्य तालिका दृश्य के रूप में व्यवहार करेगा लेकिन आपके पास अच्छा प्रभाव है जिसे मैं ढूंढ रहा था। तालिका दृश्य के सेल विभाजक को हटाना सुनिश्चित करें। –

+0

क्या आपके पास इसके लिए कोई कोड है जो काम करता है? मुझे यहां बताया गया है कि –

+0

यहां क्या समझाया गया है, इसे पुन: उत्पन्न करने में समस्या हो रही है। आईओएस 6.1 में, ऐसा प्रतीत नहीं होता है कि मुझे दृश्य की ऊंचाई में वृद्धि करना है: myTableView.tableFooterView = [[[UIView alloc] initWithFrame: CGRectZero] autorelease]; –

0

आपको शायद UITableView का एक कस्टम उप-वर्ग बनाना होगा जो रिक्त कक्षों की उपस्थिति के साथ पृष्ठभूमि को भरता है।

- (void)drawRect:(CGRect)rect { 
    [super drawRect: rect]; 

    // draw your background here if the rect intersects with the background area 
} 
5

मैंने अपनी तालिका में ~ 300px-high UIView सबक्लास सेट किया है, शीर्षलेख और पाद लेख दृश्य देखें, तालिका को समायोजित करें, इन दृश्यों को क्षतिपूर्ति करें (शीर्ष और निचले इन्सेट को -300px पर सेट करें)।

मेरे UIView उपवर्ग drawRect विधि, जिसमें मैं CGContextDrawTiledImage() का उपयोग बार-बार एक खाली UITableViewCell आकर्षित करने के लिए लागू करता है:

- (void)drawRect:(CGRect)rect { 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0); 
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero]; 
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    [emptyCell release]; 
    UIGraphicsEndImageContext(); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down 
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]); 
} 

मेरे मामले में मेरे tableviewcells, 46px अधिक हैं, इसलिए यदि मैं UIView उपवर्ग 8 शामिल करने के लिए करना चाहते हैं इन खाली कोशिकाओं में से, मुझे इसे 368 पीएक्स उच्च बनाने की जरूरत है।

+0

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

+1

इसके अलावा, मैं कोड में जादू संख्याओं का प्रशंसक नहीं हूं। मैं देखता हूं कि आपको इनका उपयोग करने के लिए मजबूर क्यों किया जाता है - आपको रिक्त कक्ष को लोड करने के लिए संदर्भ फ्रेम _before_ जानने की आवश्यकता है - लेकिन वास्तव में आपको दिए गए रेक्ट आकार में चित्रित होना चाहिए। – memmons

+0

उपरोक्त दिमाग में, मैंने आपके कोड के आधार पर एक उत्तर जोड़ा, लेकिन वास्तविक तालिका ViewCell का उपयोग करने के बजाय पृष्ठभूमि छवि को सीधे पकड़ लेता है। हालांकि, मैंने यह जवाब +1 भी दिया क्योंकि मुझे लगता है कि यह एक दिलचस्प और व्यवहार्य दृष्टिकोण है। – memmons

7

samvermette's उत्तर के आधार पर, लेकिन एक UITableViewCell सबक्लास से छवि को कंपोजिट करने के बजाय सीधे पृष्ठभूमि छवि का उपयोग करने के लिए संशोधित किया गया। सैम का जवाब अच्छा है, लेकिन यह सीधे पृष्ठभूमि छवि बनाने से कम प्रदर्शन करेगा।

एक UIView उपवर्ग बनाएं - इस उदाहरण में मैं इसे CustomTiledView कहा जाता है - और वर्ग के लिए निम्न कोड जोड़ें:

- (void)drawRect:(CGRect)rect { 
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"]; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
         CGRectMake(0, 0, rect.size.width, image.size.height), 
         [image CGImage]); 
} 

अपने tableviewcontroller लिए निम्न कोड जोड़ें:

- (CGFloat)tableView:(UITableView *)tableView 
      heightForFooterInSection:(NSInteger)section { 
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn 
    // is not cut off, 2) tall enough that footer cells 
    // cover the entire tableview height when the tableview 
    // is empty, 3) tall enough that pulling up on an empty 
    // tableview does not reveal the background. 
     return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells 
} 

- (UIView *)tableView:(UITableView *)tableView 
      viewForFooterInSection:(NSInteger)section { 
    CustomTiledView *footerView = [[CustomTiledView alloc] init]; 
    return [footerView autorelease]; 
} 

अंत में, आपको -tableView:heightForFooterInsection: से लौटाए गए मान के नकारात्मक के लिए अपने टेबलव्यू के निचले सामग्री इन्सेट को सेट करने की आवश्यकता होगी इस उदाहरण में यह -1*BACKGROUND_IMAGE_HEIGHT*9 होगा। आप इंटरफ़ेस बिल्डर के आकार निरीक्षक से या नीचे tableviewcontroller से self.tableView.contentInset संपत्ति सेट करके नीचे सामग्री इन्सेट सेट कर सकते हैं।

चीयर्स!

0

मेरा मानना ​​है कि UITableViewtableView:viewForFooterInSection: विधि का उपयोग करने का दृष्टिकोण उस स्थिति के लिए काम नहीं करेगा जहां तालिका खाली है, यानी, कोई कोशिका नहीं है।उस मामले में, आप तकनीक Answerbot प्रस्तावित तालिका के पाद लेख दृश्य में बनाया UIView सामान के लिए स्पष्ट रूप से, निम्नलिखित की तरह पुनः प्रयोजन किया जा सकता है का उपयोग कर सकते हैं:

CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height); 
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease]; 
    table.tableFooterView = footerView; 
1

आप बस "खाली कोशिकाओं की ऊंचाई को बदलना चाहते हैं "जब आपके टेबल व्यू में कोई भी कक्ष नहीं है: आपको rowHeight को अपने UITableView की संपत्ति सेट करने की आवश्यकता है (tableView:heightForRowAtIndexPath: के कार्यान्वयन का खाली तालिका दृश्यों पर कोई प्रभाव नहीं पड़ता है)। यदि आपके टेबल व्यू में सेल्स हैं और आपने tableView:heightForRowAtIndexPath: लागू किया है तो अंतिम पंक्ति ऊंचाई खाली कोशिकाओं के लिए उपयोग की जाएगी। ,

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

हार्ड तरीका अगर आप विभाजक लाइनों की जरूरत है, उस तालिका कोई विभाजक लाइनों है परिभाषित करने और सेल विभाजक लाइनों बनाने के लिए है:

+0

यह सभी कक्षों की ऊंचाई को बदल देगा, भले ही 'tableView: heightForRowAtIndexPath: 'करता है। – executor21

+0

@ execor21: सत्य नहीं, 'tableView: heightForRowAtIndexPath:' हमेशा 'rowHeight' प्रॉपर्टी के माध्यम से सेट किए गए मान को ओवरराइड करता है, लेकिन यह केवल तभी लागू होगा जब कम से कम एक सेल हो। –

3

http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html आसान तरीका से उस तालिका कोई सेल विभाजक लाइनों है परिभाषित करने के लिए है कस्टम UITableViewCell के हिस्से के रूप में। स्पष्ट रूप से, और वास्तव में पतली ग्राफिक्स छवि का उपयोग कर सेल का निचला भाग। छवि ऑटोसाइजिंग और मोड को ठीक से परिभाषित करना याद रखें।

एक और तरीका है एक खाली UITableView के tableFooterView परिभाषित करने के लिए है:

UIView *footer = 
    [[UIView alloc] initWithFrame:CGRectZero]; 
self.myTable.tableFooterView = footer; 
[footer release]; 
संबंधित मुद्दे