Для печати двумерной матрицы рассмотрим матрицу как композицию прямоугольников и / или линии, в которой меньший прямоугольник установлен в большую, возьмите границу матрицы, которая образует прямоугольник, который будет печататься, начиная с левого верхнего элемента каждый раз в каждом слое; как только вы сделаете это, перейдите внутрь для следующего слоя меньшего прямоугольника, в случае, если у меня нет прямоугольника, тогда это должна быть строка для печати, горизонтальная или вертикальная. Я вставил код с примерной матрицей 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]);
}
используйте раскадровку для изменения вставки разделителя Пользовательский слева 0 и справа 0, если вы хотите скрыть разделитель None, см. Изображение выше
просто поместите эти две строки в метод cellForRowAtIndexPath
если вы хотите, чтобы Конкретная разделительная линия начиналась с нуля, предположим, что последняя строка начинается с нуля
if (indexPath.row == array.count-1)
{
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
else
tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);
Я сделал это, сделав это:
tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
Простое решение в Swift для iOS 8 с пользовательским UITableViewCell
override func awakeFromNib() {
super.awakeFromNib()
self.layoutMargins = UIEdgeInsetsZero
self.separatorInset = UIEdgeInsetsZero
}
Таким образом, вы устанавливаете layoutMargin
и separatorInset
только один раз вместо того, чтобы делать это для каждого willDisplayCell
, как предлагает большинство приведенных выше ответов.
Если вы используете пользовательский UITableViewCell
, это правильное место, чтобы сделать это. В противном случае вы должны сделать это в tableView:cellForRowAtIndexPath
.
Просто еще один совет: вам не нужно устанавливать preservesSuperviewLayoutMargins = false
, потому что значение по умолчанию уже NO
!
Просто добавьте ниже код может решить эту программу.
Удачи тебе!
-(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];
}
}
Это код, который работает для меня, в 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)
}
}
Что касается того, что предложил 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];
}
}