समूह शैली में UITableView में सेल की चौड़ाई कैसे सेट करें


107

मैं लगभग 2 दिनों से इस पर काम कर रहा हूं, इसलिए मैंने सोचा कि मैं आपके साथ अपनी सीख साझा करूं।

सवाल यह है कि क्या किसी यूआईटेबल व्यू में सेल की चौड़ाई को छोटा करना संभव है?

जवाब न है।

लेकिन दो तरीके हैं जिनसे आप इस समस्या से घिर सकते हैं।

समाधान # 1: एक पतली तालिका यह तालिका के फ्रेम को बदलना संभव है, ताकि तालिका छोटी हो। यह UITableView सेल को कम चौड़ाई के साथ अंदर प्रदान करेगा।

इसके लिए एक समाधान इस तरह दिख सकता है:

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

समाधान # 2: छवियों द्वारा प्रदान की गई कोशिकाएं

यह समाधान यहाँ वर्णित है: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

मैं उम्मीद करता हूँ यह जानकारी आपके लिए मददगार थी। बहुत सारी संभावनाओं को आज़माने में मुझे लगभग 2 दिन लगे। यही तो बचा था।


3
मुझे लगता है कि इसे केवल दूसरी पंक्ति ("सवाल यह है: ...") के साथ एक प्रश्न के रूप में सेट किया जाना चाहिए था, फिर समाधान # 1 और समाधान # 2 दो अलग-अलग उत्तरों के रूप में पोस्ट किए गए, जिनमें से एक को स्वीकार किया गया। फिर यदि अन्य उपयोगकर्ता अपने स्वयं के उत्तर जोड़ते हैं, और उनमें से एक बेहतर होने पर समाप्त होता है, तो स्वीकृत उत्तर को बाद में बदला जा सकता है।
जनरलमीक

जवाबों:


226

इसे प्राप्त करने का एक बेहतर और साफ-सुथरा तरीका UITableViewCell को उप-वर्ग करना और इसकी -setFrame:विधि को इस तरह से ओवरराइड करना है :

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

यह बेहतर क्यों है? क्योंकि अन्य दो बदतर हैं।

  1. में तालिका दृश्य चौड़ाई समायोजित करें -viewWillAppear:

    सबसे पहले, यह अविश्वसनीय है, पर्यवेक्षक या माता-पिता नियंत्रक को टेबल व्यू फ्रेम को आगे -viewWillAppear:बुलाया जाने के बाद समायोजित किया जा सकता है। बेशक, आप -setFrame:अपने यूआईटेबल व्यू के लिए उपवर्ग और ओवरराइड कर सकते हैं जैसे मैं यूआईटेबल व्यूकैल्स के लिए यहां करता हूं। हालाँकि, UITableViewCells को उप-वर्ग करना एक बहुत ही सामान्य, हल्का और Apple तरीका है।

    दूसरी बात, यदि आपके UITableView में पृष्ठभूमि दृश्य है, तो आप नहीं चाहते कि इसकी पृष्ठभूमि दृश्य एक साथ संकरी हो। UITableView चौड़ाई को संकीर्ण करते हुए पृष्ठभूमि दृश्य चौड़ाई रखना कोई तुच्छ कार्य नहीं है, इस बात का उल्लेख नहीं करना है कि इसके पर्यवेक्षण के परे विस्तार से साक्षात्कार करना पहली जगह में बहुत ही सुंदर बात नहीं है।

  2. कस्टम सेल एक संकीर्ण चौड़ाई नकली करने के लिए प्रतिपादन

    ऐसा करने के लिए, आपको क्षैतिज मार्जिन के साथ विशेष पृष्ठभूमि चित्र तैयार करना होगा, और मार्जिन को समायोजित करने के लिए आपको स्वयं कोशिकाओं के साक्षात्कार को लेआउट करना होगा। इसकी तुलना में, यदि आप पूरी सेल की चौड़ाई को समायोजित करते हैं, तो ऑटोरेस्ज़िंग आपके लिए सभी कार्य करेगा।


2
यह एक अच्छा और सुरुचिपूर्ण समाधान है, मैंने इसे एक श्रेणी में दिया :) मैं यह भी ध्यान
दूंगा

11
@ मिस्टरकोज़ - सावधानी का एक शब्द: कुछ iOS नियंत्रण (निश्चित के लिए UIDatePicker) आंतरिक रूप से UITableViewCells का उपयोग करते हैं और यदि आप इसे किसी श्रेणी में लागू करते हैं तो इसे तोड़ दें।
क्लैफौ जूल

7
एडिट मोड में किसी सेल को हटाने की कोशिश करने पर यह तरीका iOS8 में काम नहीं करता है। जब आप सेल को सिकोड़ते रहते हैं, तो सेटफ्रैम को आप संपादन / निकास मोड में दर्ज करते हैं। इसका कोई हल?
जॉन बॉम

3
@ जॉनबॉम इस मदद कर सकता है (कम से कम मेरे मामले में यह काम करता है): stackoverflow.com/questions/25911484/ios-8-cell-resizing/…
HashtagMarkus

2
यह समाधान वास्तव में ईश्वरवादी है। यदि कोई सोच रहा है कि स्विफ्ट में समान कैसे किया जाए - reddit.com/r/swift/comments/2fr849/…
sysuser

16

स्विफ्ट में ऐसा करने के लिए, जो चर सेट करने के तरीके प्रदान नहीं करता है, आपको इसके लिए सेटर को ओवरराइड करना होगा frame। मूल रूप से पोस्ट किया गया (कम से कम जहां मैंने इसे पाया) यहां

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}

स्विफ्ट के लिए काम करता है
साइमन मैकनील

9

अगर कुछ भी काम नहीं करता है तो आप यह कोशिश कर सकते हैं

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


8

मुझे लगता है कि स्वीकृत समाधान रोटेशन पर काम नहीं किया। तय चौड़ाई और लचीले मार्जिन के साथ UITableViewCells को प्राप्त करने के लिए मैंने उपरोक्त समाधान को निम्नलिखित के लिए अनुकूलित किया है:

- (void)setFrame:(CGRect)frame {

    if (self.superview) {
        float cellWidth = 500.0;
        frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
        frame.size.width = cellWidth;
    }

    [super setFrame:frame];
}

जब भी उपकरण घूमता है तो विधि को बुलाया जाता है, इसलिए कोशिकाएं हमेशा केंद्रित रहेंगी।


0

एक ऐसी विधि है जिसे स्क्रीन को घुमाए जाने पर कहा जाता है: viewWillTransitionToSize

यह वह जगह है जहाँ आपको फ़्रेम का आकार बदलना चाहिए। उदाहरण देखें। फ्रेम कोर्ड्स को बदलें जैसे आपको करना है।

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}

-2

में करता हूँ

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
    CGFloat tableBorderRight = self.view.frame.size.width - 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect;
}

और यह मेरे लिए काम किया


-6

.H फ़ाइल में प्रतिनिधि 'UITableViewDataSource' जोड़ें

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}

4
वह चौड़ाई निर्धारित करना चाहता है, ऊंचाई नहीं
क्रिस्टोफर पिक्सले

ओह हू। असुविधा के लिए sry।
भारत गैंगूपल्ली

u प्रश्न को गलत समझें और ऊँचाई के लिए उत्तर दें और आप जानते हैं कि मेरे लिए इसका क्या काम है क्योंकि मैं ऊँचाई की खोज कर रहा हूँ न कि चौड़ाई के लिए। उत्तर के लिए धन्यवाद
पूजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.