วิธีตั้งค่าความกว้างของเซลล์ใน UITableView ในรูปแบบที่จัดกลุ่ม


107

ฉันทำงานนี้มาประมาณ 2 วันแล้วฉันจึงคิดว่าฉันจะแบ่งปันสิ่งที่ฉันเรียนรู้กับคุณ

คำถามคือเป็นไปได้หรือไม่ที่จะทำให้ความกว้างของเซลล์ใน UITableView ที่จัดกลุ่มเล็กลง

คำตอบคือ: ไม่

แต่มีสองวิธีที่คุณสามารถแก้ไขปัญหานี้ได้

โซลูชัน # 1: ตารางที่บางลง เป็นไปได้ที่จะเปลี่ยนกรอบของ tableView เพื่อให้ตารางมีขนาดเล็กลง สิ่งนี้จะส่งผลให้ 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 จะโพสต์เป็นคำตอบแยกกันสองคำโดยหนึ่งในนั้นได้รับการยอมรับ จากนั้นหากผู้ใช้รายอื่นเพิ่มคำตอบของตนเองและหนึ่งในนั้นมีคำตอบที่ดีกว่าคำตอบที่ยอมรับจะสามารถเปลี่ยนแปลงได้ในภายหลัง
GeneralMike

คำตอบ:


226

วิธีที่ดีกว่าและสะอาดกว่าในการบรรลุสิ่งนี้คือคลาสย่อย UITableViewCell และแทนที่-setFrame:วิธีการเช่นนี้:

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

ทำไมถึงดีขึ้น? เพราะอีกสองคนแย่กว่า.

  1. ปรับความกว้างของมุมมองตารางใน -viewWillAppear:

    ประการแรกสิ่งนี้ไม่น่าเชื่อถือตัวควบคุมมุมมองขั้นสูงหรือมุมมองหลักอาจปรับกรอบมุมมองตารางให้ไกลขึ้นหลังจากที่-viewWillAppear:เรียกแล้ว แน่นอนคุณสามารถซับคลาสและแทนที่-setFrame:UITableView ของคุณได้เช่นเดียวกับสิ่งที่ฉันทำที่นี่สำหรับ UITableViewCells อย่างไรก็ตาม UITableViewCells subclassing เป็นวิธีที่ธรรมดามากเบาและ Apple

    ประการที่สองหาก UITableView ของคุณมี backgroundView คุณไม่ต้องการให้ backgroundView แคบลงพร้อมกัน การรักษาความกว้างของ backgroundView ในขณะที่แคบลงความกว้างของ UITableView ไม่ใช่เรื่องเล็กน้อย แต่ไม่ต้องพูดถึงว่าการขยายมุมมองย่อยนอกเหนือจาก superview นั้นไม่ใช่สิ่งที่สวยงามมากที่ต้องทำตั้งแต่แรก

  2. การแสดงผลเซลล์ที่กำหนดเองเพื่อปลอมความกว้างที่แคบกว่า

    ในการทำเช่นนี้คุณต้องเตรียมภาพพื้นหลังพิเศษที่มีระยะขอบแนวนอนและคุณต้องจัดวางมุมมองย่อยของเซลล์ด้วยตัวเองเพื่อให้เหมาะกับระยะขอบ ในการเปรียบเทียบถ้าคุณเพียงแค่ปรับความกว้างของทั้งเซลล์การปรับขนาดอัตโนมัติจะทำงานทั้งหมดให้คุณ


2
นี่เป็นวิธีแก้ปัญหาที่ดีและสวยงามฉันทำในหมวดหมู่ :) ฉันสังเกตด้วยว่ายิ่งวัตถุโปร่งใสมากขึ้น CPU ก็ยิ่งโหลดมากขึ้น :)
mister koz

11
@misterkoz - คำเตือน: การควบคุม iOS บางอย่าง (UIDatePicker เพื่อความชัดเจน) ใช้ UITableViewCells ภายในและหยุดทำงานหากคุณใช้สิ่งนี้ในหมวดหมู่
Clafou

7
วิธีนี้ดูเหมือนจะใช้ไม่ได้ใน iOS8 เมื่อพยายามลบเซลล์ในโหมดแก้ไข setFrame จะถูกเรียกเมื่อคุณเข้า / ออกจากโหมดแก้ไขเพื่อให้เซลล์หดตัวลงเรื่อย ๆ วิธีแก้ปัญหานี้หรือไม่?
John Baum

3
@JohnBaum สิ่งนี้อาจช่วยได้ (อย่างน้อยก็ในกรณีของฉันมันก็ใช้ได้): stackoverflow.com/questions/25911484/ios-8-cell-resizing/…
HashtagMarkus

2
โซลูชันนี้เป็นขั้นเทพอย่างแท้จริง
เผื่อ

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
    }
}

ทำงานเพื่อความรวดเร็ว
Simon McNeil

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

นี่คือจุดที่คุณควรปรับขนาดเฟรม ดูตัวอย่าง เปลี่ยน Coords ของเฟรมตามที่คุณต้องการ

- (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
เขาต้องการกำหนดความกว้างไม่ใช่ความสูง
Christopher Pickslay

โอ้ฮู ขออภัยในความไม่สะดวก
bharath gangupalli

คุณเข้าใจผิดคำถามและคุณตอบเรื่องความสูงและคุณก็รู้ว่ามันเหมาะกับฉันเพราะฉันกำลังค้นหาความสูงไม่ใช่สำหรับความกว้าง. ขอบคุณสำหรับคำตอบ
Pooja
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.