Вставка разделителя UITableView в iOS 8 не работает

Для печати двумерной матрицы рассмотрим матрицу как композицию прямоугольников и / или линии, в которой меньший прямоугольник установлен в большую, возьмите границу матрицы, которая образует прямоугольник, который будет печататься, начиная с левого верхнего элемента каждый раз в каждом слое; как только вы сделаете это, перейдите внутрь для следующего слоя меньшего прямоугольника, в случае, если у меня нет прямоугольника, тогда это должна быть строка для печати, горизонтальная или вертикальная. Я вставил код с примерной матрицей HTH.

#include <stdio.h>

int a[2][4] = { 1, 2 ,3, 44,
                8, 9 ,4, 55 };

void print(int, int, int, int);

int main() {

int row1, col1, row2, col2;

row1=0;
col1=0;
row2=1;
col2=3;


while(row2>=row1 && col2>=col1)
{
    print(row1, col1, row2, col2);

    row1++;
    col1++;
    row2--;
    col2--;
}

return 0;
}


void print(int row1, int col1, int row2, int col2) {

int i=row1;
int j=col1;

/* This is when single horizontal line needs to be printed */
if( row1==row2 && col1!=col2) {
    for(j=col1; j<=col2; j++)
        printf("%d ", a[i][j]);
    return;
}

/* This is when single vertical line needs to be printed */
if( col1==col2 && row1!=row2) {
    for(i=row1; j<=row2; i++)
        printf("%d ", a[i][j]);
    return;
}


/* This is reached when there is a rectangle to be printed */

for(j=col1; j<=col2; j++)
    printf("%d ", a[i][j]);

for(j=col2,i=row1+1; i<=row2; i++)
    printf("%d ", a[i][j]);

for(i=row2,j=col2-1; j>=col1; j--)
    printf("%d ", a[i][j]);

for(j=col1,i=row2-1; i>row1; i--)
    printf("%d ", a[i][j]);

}
655
задан Shobhakar Tiwari 25 May 2017 в 18:12
поделиться

7 ответов

enter image description here

используйте раскадровку для изменения вставки разделителя Пользовательский слева 0 и справа 0, если вы хотите скрыть разделитель None, см. Изображение выше

0
ответ дан Phani Sai 25 May 2017 в 18:12
поделиться

просто поместите эти две строки в метод cellForRowAtIndexPath

  • , если вы хотите, чтобы все разделительные линии начинались с нуля [cell setSeparatorInset: UIEdgeInsetsZero]; [cell setLayoutMargins: UIEdgeInsetsZero];

если вы хотите, чтобы Конкретная разделительная линия начиналась с нуля, предположим, что последняя строка начинается с нуля

if (indexPath.row == array.count-1) 
{
   [cell setSeparatorInset:UIEdgeInsetsZero];
   [cell setLayoutMargins:UIEdgeInsetsZero];
}
else
   tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);
0
ответ дан Shabnam 25 May 2017 в 18:12
поделиться

Я сделал это, сделав это:

tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
11
ответ дан ideawu 25 May 2017 в 18:12
поделиться

Простое решение в Swift для iOS 8 с пользовательским UITableViewCell

override func awakeFromNib() {
    super.awakeFromNib()

    self.layoutMargins = UIEdgeInsetsZero
    self.separatorInset = UIEdgeInsetsZero
}

Таким образом, вы устанавливаете layoutMargin и separatorInset только один раз вместо того, чтобы делать это для каждого willDisplayCell, как предлагает большинство приведенных выше ответов.

Если вы используете пользовательский UITableViewCell, это правильное место, чтобы сделать это. В противном случае вы должны сделать это в tableView:cellForRowAtIndexPath.

Просто еще один совет: вам не нужно устанавливать preservesSuperviewLayoutMargins = false, потому что значение по умолчанию уже NO!

8
ответ дан Francesco Vadicamo 25 May 2017 в 18:12
поделиться

Просто добавьте ниже код может решить эту программу.

Удачи тебе!

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

       if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
           [cell setSeparatorInset:UIEdgeInsetsZero];
       }

       if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
           [cell setLayoutMargins:UIEdgeInsetsZero];
       }

}
7
ответ дан JimmyChang 25 May 2017 в 18:12
поделиться

Это код, который работает для меня, в Swift:

override func viewDidLoad() 
{
    super.viewDidLoad()
    ...
    if tableView.respondsToSelector("setSeparatorInset:") {
        tableView.separatorInset = UIEdgeInsetsZero
    }
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset.left = CGFloat(0.0)
    }
    if tableView.respondsToSelector("setLayoutMargins:") {
        tableView.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins.left = CGFloat(0.0)
    }
}

Это кажется мне наиболее чистым (на данный момент), так как все настройки края / поля в cell / tableView выполняются в tableView:willDisplayCell:forRowAtIndexPath:, без добавления ненужного кода в tableView:cellForRowAtIndexPath:.

Кстати, я только устанавливаю левый разделитель ячейки / layoutMargins ячейки, потому что в этом случае я не хочу испортить мои ограничения, которые я установил в своей ячейке.

Код обновлен до Swift 2.2:

 override func viewDidLoad() {
   super.viewDidLoad()       

    if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
      tableView.separatorInset = UIEdgeInsetsZero
        }
    }

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.respondsToSelector(Selector("setSeparatorInset:")) {
            cell.separatorInset.left = CGFloat(0.0)
        }
        if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
            tableView.layoutMargins = UIEdgeInsetsZero
        }
        if cell.respondsToSelector(Selector("setLayoutMargins:")) {
            cell.layoutMargins.left = CGFloat(0.0)
        }
    }
5
ответ дан Jayprakash Dubey 25 May 2017 в 18:12
поделиться

Что касается того, что предложил cdstamper вместо табличного представления, то добавление строк ниже в методе layoutSubview ячейки работает для меня.

- (void)layoutSubviews 
{
    [super layoutSubviews];

    if ([self respondsToSelector:@selector(setSeparatorInset:)])
                [self setSeparatorInset:UIEdgeInsetsZero];

        if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
        {
            [self setPreservesSuperviewLayoutMargins:NO];;
        }

        if ([self respondsToSelector:@selector(setLayoutMargins:)]) 
        {
            [self setLayoutMargins:UIEdgeInsetsZero];
        }
}
9
ответ дан P.J.Radadiya 25 May 2017 в 18:12
поделиться