iphone - आईफोन एसडीके ऐप के लिए एक एम्परेन्टियन व्यू को कैसे कार्यान्वित करें?




objective-c iphone-sdk-3.0 (4)

मुझे यह कोड मिला: एडीरियन का एक सरल कार्यान्वयन ..

https://github.com/kuon/ios-example-accordion

मुझे आशा है कि यह किसी एक को मदद करेगा ..

क्या किसी ने आईफोन के लिए एक "एॉर्डियन" (शायद "एनिमेटेड रूपरेखा" कहा जाता है) का कार्यान्वयन देखा है? मुझे कोको के लिए एक उदाहरण परियोजना मिली, लेकिन एक बंदरगाह की कोशिश करने से पहले, मैं उम्मीद कर रहा था कि किसी ने पहले से पहिये का आविष्कार किया है

इसे स्पष्ट करने के लिए, एक UIView में, अनुभागों के एक ढेर पर विचार करें, प्रत्येक में एक हेडर है, और फिर कुछ सामग्री। जब उपयोगकर्ता शीर्ष लेख को छूता है (या कुछ संदेश / घटना के माध्यम से), यदि अनुभाग पहले से ही खुला है => इसे बंद करें; यदि अनुभाग बंद है => इसे खोलें और किसी अन्य खुले अनुभाग को बंद करें JQuery में एक उदाहरण दिखता है: http://docs.jquery.com/UI/Accordion

मेरे मामले में, मैं प्रत्येक अनुभाग में किसी भी UIView सामग्री को रखने में सक्षम होना चाहता हूँ।

मुझे कुछ वास्तविक ऐप्स देखने में दिलचस्पी होगी जो इसे लागू कर चुके हैं - सिर्फ यह जानना कि यह संभव है!



मैं सिर्फ UITableView का उपयोग करूँगा, प्रत्येक सेल की ऊंचाई उस पर निर्भर करती है कि यह "खुले" है और फिर वहां से चले जाते हैं। पंक्तियों का आकार बदलना आसान है और आप संयुक्त कोशिकाओं के लिए कुल ऊँचाई सिर्फ UITableView में उपलब्ध ऊँचाई बना सकते हैं ताकि यह सिर्फ एक तालिका से अधिक एक एम्परेन्टन की तरह दिखाई दे।

यह एक त्वरित हैक है जो काम करना चाहिए, लेकिन आपके UITableViewController subclass .h फ़ाइल में:

bool sectionopen[4]; ///or some other way of storing the sections expanded/closed state

और। एम फाइल में कुछ ऐसा लगा:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 4;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  {
    if (sectionopen[indexPath.row]) {
        return 240;///it's open
    } else {
        return 45;///it's closed
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *mycell = [[[UITableViewCell alloc] init] autorelease];
    mycell.textLabel.text= @"Section Name";
    return mycell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ///turn them all off
    sectionopen[0]=NO;
    sectionopen[1]=NO;
    sectionopen[2]=NO;
    sectionopen[3]=NO;

    ///open this one
    sectionopen[indexPath.row]=YES;

    ///animate the opening and expand the row
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}

यह मूल रूप से 4 पंक्तियों को लेता है और उन्हें ढहने वाले हिस्सों में बदल देता है जहां एक पंक्ति का चयन 240 पिक्सल तक बढ़ेगा और अन्य सभी पंक्तियों को 40 से घटा देगा। आप उन सभी नंबरों को बदल सकते हैं और अनुभागों को समझ सकते हैं और जो कुछ भी आप चाहते हैं इसके साथ।

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


यहां CollapsingTableViewDelegate वर्ग है जिसे मैं वर्तमान में ऐसा करने के लिए काम कर रहा हूं। यह केवल स्थिर तालिका सामग्री के साथ कार्य करता है

आप इस वर्ग को CollapsingTableCellDelegate कार्यान्वयन की आपूर्ति करते हैं, जिसे प्रत्येक पंक्ति के संक्षिप्त और विस्तारित आकारों की गणना करने के बारे में पता होना चाहिए, और प्रत्येक पंक्ति के लिए UIView कैसे बनाएं यह दृश्य एक ही रहता है चाहे ढह जाता है या विस्तार किया जाता है, ताकि प्रत्येक पंक्ति के दृश्य के शीर्ष झुकाव उस पंक्ति के क्लिक करने योग्य शीर्षलेख के रूप में कार्य करता हो।

फिर आप इस वर्ग को डेटा स्रोत और प्रतिनिधि को अपने UITableView लिए बनाते हैं।

हैडर फ़ाइल CollapsingTableViewDelegate.h :

#import <UIKit/UIKit.h>

@protocol CollapsingTableCellDelegate<NSObject>

@required
- (CGFloat)collapsingCellHeightForRow:(int)row expanded:(BOOL)expanded;
- (UIView *)collapsingCellViewForRow:(int)row;

@optional
- (BOOL)collapsingCellAllowCollapse:(int)row;

@end

struct cell;

@interface CollapsingTableViewDelegate : NSObject <UITableViewDelegate, UITableViewDataSource> {
    id<CollapsingTableCellDelegate> cellDelegate;
    int numCells;
    int currentSelection;
    struct cell *cells;
}

@property (nonatomic, retain, readonly) id<CollapsingTableCellDelegate> cellDelegate;
@property (nonatomic, assign, readonly) int numCells;
@property (nonatomic, assign) int currentSelection;
@property (nonatomic, assign, readonly) struct cell *cells;

- (CollapsingTableViewDelegate *)initWithCellDelegate:(id<CollapsingTableCellDelegate>)delegate numCells:(int)numCells;
- (void)tableView:(UITableView *)tableView touchRow:(int)newSelection;

@end

और स्रोत फ़ाइल CollapsingTableViewDelegate.m :

#import "CollapsingTableViewDelegate.h"

@implementation CollapsingTableViewDelegate

struct cell {
    u_char expanded;
    u_char collapsable;
};

@synthesize cellDelegate;
@synthesize currentSelection;
@synthesize cells;
@synthesize numCells;

#pragma mark -
#pragma mark Setup and Teardown

- (CollapsingTableViewDelegate *)initWithCellDelegate:(id<CollapsingTableCellDelegate>)delegate numCells:(int)num {
    if ([super init] == nil)
        return nil;
    if ((cells = calloc(num, sizeof(*cells))) == NULL) {
        [self autorelease];
        return nil;
    }
    cellDelegate = [delegate retain];
    numCells = num;
    for (int row = 0; row < self.numCells; row++) {
        struct cell *const cell = &self.cells[row];

        cell->collapsable = ![self.cellDelegate respondsToSelector:@selector(collapsingCellAllowCollapse:)]
          || [self.cellDelegate collapsingCellAllowCollapse:row];
        cell->expanded = !cell->collapsable;
    }
    currentSelection = -1;
    return self;
}

- (void)dealloc {
    [cellDelegate release];
    free(cells);
    [super dealloc];
}

- (void)tableView:(UITableView *)tableView reloadRow:(int)row fade:(BOOL)fade {
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:0]]
                     withRowAnimation:fade ? UITableViewRowAnimationFade : UITableViewRowAnimationNone];
}

- (void)tableView:(UITableView *)tableView touchRow:(int)newSelection {

    // Sanity check
    if (newSelection < -1 || newSelection >= self.numCells) {
        NSLog(@"CollapsingTableViewDelegate: invalid row %d not in the range [-1..%d)", newSelection, self.numCells);
        return;
    }

    // Gather info
    int oldSelection = self.currentSelection;
    BOOL sameCellSelected = newSelection == oldSelection;
    struct cell *const oldCell = oldSelection != -1 ? &self.cells[oldSelection] : NULL;
    struct cell *const newCell = newSelection != -1 ? &self.cells[newSelection] : NULL;

    // Mark old cell as collapsed and new cell as expanded
    if (newCell != NULL)
        newCell->expanded = TRUE;
    if (oldCell != NULL)
        oldCell->expanded = FALSE;
    self.currentSelection = sameCellSelected ? -1 : newSelection;

    // Update table view
    if (oldSelection >= newSelection) {
        if (oldSelection != -1)
            [self tableView:tableView reloadRow:oldSelection fade:sameCellSelected];
        if (newSelection != -1 && !sameCellSelected)
            [self tableView:tableView reloadRow:newSelection fade:TRUE];
    } else {
        if (newSelection != -1 && !sameCellSelected)
            [self tableView:tableView reloadRow:newSelection fade:TRUE];
        if (oldSelection != -1)
            [self tableView:tableView reloadRow:oldSelection fade:sameCellSelected];
    }

    // If expanding a cell, scroll it into view
    if (newSelection != -1 && !sameCellSelected) {
        [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:newSelection inSection:0]
                         atScrollPosition:UITableViewScrollPositionTop
                                 animated:TRUE];
    }
}

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.numCells;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = [indexPath row];
    struct cell *const cell = &self.cells[row];
    return [self.cellDelegate collapsingCellHeightForRow:row expanded:cell->expanded];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = [indexPath row];
    UIView *cellView = [self.cellDelegate collapsingCellViewForRow:row];
    [cellView removeFromSuperview];
    UITableViewCell *tvcell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
    [tvcell.contentView addSubview:cellView];
    tvcell.clipsToBounds = TRUE;
    tvcell.selectionStyle = UITableViewCellSelectionStyleNone;
    return tvcell;
}

#pragma mark -
#pragma mark Table view delegate

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = [indexPath row];
    struct cell *const cell = &self.cells[row];
    return cell->collapsable ? indexPath : nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newSelection {
    [tableView deselectRowAtIndexPath:newSelection animated:TRUE];
    [self tableView:tableView touchRow:[newSelection row]];
}

@end

पूर्णता नहीं है, लेकिन मूल रूप से मेरे लिए काम करने लगता है





uiview