IOS UITableView HeaderView जोड़ना (अनुभाग शीर्षलेख नहीं)


167

मैं उदाहरण के लिए कॉन्टैक्ट्स ऐप में टेबल हेडर (सेक्शन हेडर नहीं) जोड़ना चाहता हूं: यहां छवि विवरण दर्ज करें

ठीक उसी तरह - तालिका के ऊपर एक छवि के पास एक लेबल।

मैं चाहता हूं कि सभी दृश्य स्क्रॉल किए जा सकें, इसलिए मैं उन लोगों को टेबल के बाहर नहीं रख सकता।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


245

UITableViewएक tableHeaderViewसंपत्ति है। सेट करें कि जो कुछ भी आप वहां देखना चाहते हैं।

UIViewएक कंटेनर के रूप में एक नए का उपयोग करें, उस नए पर एक टेक्स्ट लेबल और एक छवि दृश्य जोड़ें UIView, फिर tableHeaderViewनए दृश्य पर सेट करें।

उदाहरण के लिए UITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

महान! धन्यवाद यह काम कर रहा है। क्या टेबलव्यू सेल बनाने की कोई संपत्ति अंदर के पाठ जितनी बड़ी है?
असफ बी

ऐसा करने के लिए, आपको एक स्ट्रिंग दी गई सेल की ऊंचाई की गणना करने में सक्षम होना चाहिए, और उस मान को heightForRowAtIndexPath के लिए पास करना होगा। आप NSString की विधि का उपयोग कर सकते हैं साइज़WithFont: constrainedToSize: एक आकार के लिए विवश होने पर पाठ की ऊँचाई का पता लगाने के लिए फ़ंक्शन।
मार्क

लेआउट के बाद इसे जोड़ें, या यह आकार आपके वांछित नहीं होगा। और viewDidLoad एक अच्छी जगह है।
बोलबम

क्या viewDidLoad चरण के दौरान दृश्य की ज्यामिति सेट करना एक अच्छा अभ्यास है?
नंदीश ए

1
ठीक है अगर आप टेबल्स स्रोत में हेडर दृश्य को सेट करते हैं तो यह काम करने लगता है, साथ ही ऊँचाई निर्धारित करना सुनिश्चित करें: उदाहरण:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

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


12
मुझे यह उत्तर पसंद है क्योंकि मैं कोड क्यों लिखता हूं जब मैं इसे बड़े करीने से सेट कर सकता हूं और इसे आईबी में रख सकता हूं
Besi

1
संकेत के लिए बहुत बढ़िया धन्यवाद। यदि कोई और सोच रहा था या कोशिश कर रहा था तो BTW आपको अपने हेडर में स्क्रॉल दृश्य की आवश्यकता नहीं है। यह आपके हेडर के लिए UITableView के स्क्रॉलव्यू का उपयोग करता है, क्योंकि हैडर तकनीकी रूप से UITableView का एक हिस्सा है
Rob R.

2
वर्थ यह उल्लेख करने के लिए कि यह स्टोरीबार्ड संपादक में अब कैसे काम करता है: stackoverflow.com/q/7841167/926907
दिमित्री

इसके लिए एक निब का उपयोग न करें। लोड होने में अधिक समय लेता है। इसे कोड में लिखें। पुन: प्रयोज्य के लिए एक कस्टम क्लास और इंस्टेंटिअट बनाएं ...
चार्ल्स रॉबर्टसन

1
यह मुझे शीर्ष लेख दृश्य में एक ऊंचाई बाधा जोड़ने की अनुमति नहीं देगा।
इयान वॉर्बर्टन

14

में स्विफ्ट :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

IOS 7 या इसके बाद के संस्करण के लिए इस दृष्टिकोण का उपयोग एक रनटाइम चेतावनी देगा: "तालिका सेल का पुन: उपयोग नहीं किया जा रहा है"। इस त्रुटि से बचने के लिए, संदर्भ लिंक
baskInminmin

11

आप केवल इंटरफ़ेस बिल्डर में केवल एक UIView भी बना सकते हैं और ImageView और UILabel को ड्रैग और ड्रॉप कर सकते हैं (इसे अपने इच्छित हेडर की तरह दिखने के लिए) और फिर उसका उपयोग करें।

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

उदाहरण के लिए मेरे पास मेरे एक टेबल हेडर के लिए एक कस्टम यूआईवाईईवाई है। इस दृश्य को "CustomHeaderView" नामक एक xib फ़ाइल द्वारा प्रबंधित किया जाता है और इसे मेरे UITableViewController उपवर्ग में निम्नलिखित कोड का उपयोग करके तालिका शीर्षलेख में लोड किया जाता है:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

-36
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

आपका प्रश्न समझ में नहीं आया?
प्रियम

2
ये गलत है। वह केवल एकल तालिका शीर्ष लेख चाहता है, अनुभाग शीर्ष लेख नहीं। दोनों चीजें बहुत अलग हैं। कृपया प्रश्न पढ़ें।
चार्ल्स रॉबर्टसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.