Як встановити ширину комірки в 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 - це дуже поширений, легкий і Apple спосіб.

    По-друге, якщо ваш UITableView має backgroundView, ви не хочете, щоб його backgroundView звужувалися разом. Збереження ширини backgroundView при звуженні ширини UITableView не є тривіальною роботою, не кажучи вже про те, що розширення підпогляду за межами його перегляду в першу чергу не дуже елегантна справа.

  2. Спеціальна візуалізація комірок для підробки меншої ширини

    Для цього вам потрібно підготувати спеціальні фонові зображення з горизонтальними полями, і вам доведеться самостійно розміщувати підгляди комірок для розміщення поля. Для порівняння, якщо ви просто регулюєте ширину всієї комірки, автоматична автоматизація зробить усі роботи за вас.


2
це приємне та елегантне рішення, я зробив це в категорії :) Я також зазначу, що чим прозоріші об'єкти, тим більше завантаження процесора :)
mister koz

11
@misterkoz - слово обережності: Деякі елементи управління iOS (UIDatePicker визначено) внутрішньо використовують UITableViewCells і ламають, якщо ви реалізуєте це в категорії.
Clafou

7
Схоже, цей метод не працює в iOS8 при спробі видалити комірку в режимі редагування. SetFrame отримує виклик, коли ви входите / виходите з режиму редагування, так що комірка постійно зменшується. Будь-яке рішення цього?
Джон Баум

3
@JohnBaum це може допомогти (принаймні , в моєму випадку це працює): stackoverflow.com/questions/25911484/ios-8-cell-resizing / ...
HashtagMarkus

2
Це рішення справді знахідка. Якщо хтось задається питанням, як зробити те ж саме в швидкому режимі - reddit.com/r/swift/comments/2fr849/…
sysuser

16

Для цього в Swift, який не передбачає методів встановлення змінних, вам доведеться перекрити сетер для 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
Він хоче встановити ширину, а не висоту
Крістофер Пікслі

о-о-о. срі за незручності.
bharath gangupalli

ти неправильно розумієш питання і ти відповідаєш на висоту, і ти знаєш, що його працює для мене, тому що я шукаю висоту не для ширини .. дякую за відповідь
Pooja
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.