UITableViewCell Separator исчезает в iOS7


129

У меня странная проблема UITableViewтолько с iOS 7.

UITableViewCellSeparatorисчезает над первой строкой и под последней строкой. Иногда после выбора строк или некоторых действий прокрутки он появляется.

В моем случае tableViewзагружается из стиля Storyboardwith UITableViewStylePlain. Проблема точно не в том UITableViewCellSeparatorStyle, что по умолчанию не изменилось UITableViewCellSeparatorStyleSingleLine.

Как я читал на форумах Apple Dev ( здесь и здесь ), у других людей есть такая проблема, и можно найти некоторые обходные пути, например:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

Но я все еще ищу причину такого странного поведения разделителя.

Любые идеи?

Обновление: как я видел в бета-версии XCode 5.1 DP и iOS 7.1, Apple пыталась решить эту проблему. Теперь разделитель отображается по мере необходимости, иногда под последней строкой, после некоторого обновления, но не после создания представления таблицы.


19
Иногда мне кажется, что iOS7 такая незрелая. Этот и длинный список вещей, которые у меня здесь, показывают, насколько iOS7 далека от совершенства предыдущих iOS.
Bms270

1
Приложение «Настройки» от Apple имеет ту же проблему, поэтому я считаю, что это проблема iOS 7. Я сообщил об этом, и в своем последующем они попросили изображения, показывающие проблему.
Johan

@Gatada Где в приложении "Настройки" вы видите проблему?
Джейми Форрест

2
Обнаружена та же проблема и устранена путем добавления [cell setSeparatorInset: UIEdgeInsetsFromString (@ "1")]; с методом in (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
Айеша Фатима

1
В бета-версиях iOS 8.0 это все еще не работает. Я открыл радар 17724043 на тот случай, если кто-то захочет его обмануть.
Энди Уилкинсон

Ответы:


77

Я сбросил иерархию подпредставлений затронутых ячеек и обнаружил, что для них _UITableViewCellSeparatorViewустановлено значение скрыто. Не зря его не показывают!

Я переопределил layoutSubviewsв своем UITableViewCellподклассе, и теперь разделители отображаются надежно:

Цель-C :

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

Swift :

override func layoutSubviews() {
    super.layoutSubviews()

    guard let superview = contentView.superview else {
        return
    }
    for subview in superview.subviews {
        if String(subview.dynamicType).hasSuffix("SeparatorView") {
            subview.hidden = false
        }
    }
}

Другие предлагаемые здесь решения не работали для меня последовательно или казались неуклюжими (добавление пользовательских представлений нижнего колонтитула 1 пиксель).


Я использовал ваш метод, но не в подклассе. Я добавил категорию в UITableViewCell. Мне это помогло. Спасибо.
Виталий Боярский 02

Конечно, это возможно и в категории. Поскольку это требует смены методов, я выбрал простой подклассовый подход.
Ортвин Генц

3
Это единственное решение, которое у меня сработало. Моя проблема возникла, когда в UITableView было достаточно строк для прокрутки. Однако эта часть hasSuffix: довольно хрупкая.
juhan_h

Работает для меня. Может быть, вопрос глупый, но разве это не использование Private API?
Foriger

1
У меня работает в iOS9
tounaobun

42

Это сработало для меня:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

Вы заслуживаете большего количества голосов, это именно то, что мне было нужно, я добавил его в категорию, поэтому теперь, когда я сделаю [tableView reloadData], если эта ошибка произойдет (в моем случае снова появляется разделитель нижнего колонтитула, который был скрыт), я вызываю [tableView reloadSeparators];
NiñoScript 05

12

Я также имел проблемы с отсутствующими сепаратора , и я обнаружил, что проблема возникла только тогда , когда heightForRowAtIndexPathбыл возвращающая десятичное число . Решение:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}

1
Что делать, если я не реализую даже метод heightForRowAtIndexPath?
BS

Интересный. Однако это происходит и в моем проекте - и heightForRowAtIndexPath не реализован. В IB высота строки / ячейки равна 100.
Йохан

6
Для меня это не решило проблему, и у меня есть метод heightForRowAtIndexPath.
Гергей Ковач

Решает вопрос хотя бы частично. Кажется, что ячейка сбивает с толку нецелые высоты.
Ник Фролов

Вам нужно ограничить количество пикселей, а затем разделить на коэффициент масштабирования экрана, чтобы получить точки, которые могут быть в десятичном формате. Если вы этого не сделаете, сетчатка не будет оптимизирована.
trss

11

Вы пытались добавить UIView высоты 1 в заголовок и нижний колонтитул таблицы со светло-серым цветом фона? В основном он будет издеваться над первым и последним разделителями.


звучит хорошо, но как именно это сделать? использовать viewforfooter?
skinsfan00atg

1
не так просто, как кажется, по какой-то причине мне пришлось также реализовать heightforfooter, иначе высота, указанная в initwithframe, игнорировалась. Я также замечаю, что светло-серый цвет не того же цвета, поэтому это не сработает. возможно придется сделать кастом серый
skinsfan00atg

это довольно дрянной ИМО
Джеки Джонсон

Да, полностью согласен. Это единственный обходной путь, который я нашел сразу после выпуска iOS 7. Есть ли лучший подход сейчас?
airpaulg

2
Чтобы соответствовать цвету, используйте tableView.separatorColor
Джефф

8

@samvermette

Я решил проблему, используя методы делегата. Теперь не мерцает:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}

7

Мы столкнулись с этой проблемой в нашем приложении. Когда пользователь выбрал ячейку, новое представление таблицы было помещено в стек контроллера навигации, а затем, когда пользователь вытащил его, разделитель отсутствовал. Мы решили его, положив [self.tableView deselectRowAtIndexPath:indexPath animated:NO];в didSelectRowAtIndexPathметод делегата табличного.


Вы пробовали self.tableView.allowsMultipleSelection = NO;?
wrightak

6

Вот более простой (хотя и немного запутанный) обходной путь, если он вам нужен, попробуйте выбрать и отменить выбор ячейки после перезагрузки данных и выполнения анимации по умолчанию.

просто добавь:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];

1
Этот обходной путь исправил это для меня; однако я перевернул его - чтобы сохранить выбор. Итак, сначала отмените выбор, затем снова выберите.
Johan

2
Я не знаю, что отменять, когда вы говорите «после перезагрузки данных»
airpaulg

6

Я обнаружил, что самое простое решение - после перезагрузки ячейки также перезагрузить ячейку выше:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}

1
Работал у меня. Спасибо. Никакие другие методы мне не помогли (включая изменение стиля разделителя из ответа Samvermette).
surfrider

4

Простое и понятное решение, работающее как на iOS 8, так и на iOS 9 (beta 1).

Вот простой, чистый и ненавязчивый обходной путь. Он включает в себя вызов метода категории, который исправит разделители.

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

for (UIView *subview in cell.contentView.superview.subviews) {
    if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
        subview.hidden = NO;
    }
}

Я рекомендую добавить это в категорию на UITableViewCell, например:

@interface UITableViewCell (fixSeparator)
- (void)fixSeparator;
@end

@implementation UITableViewCell (fixSeparator)

- (void)fixSeparator {
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

@end

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

@implementation UITableView (fixSeparators)

- (void)fixSeparators {
    for (UITableViewCell *cell in self.visibleCells) {
        [cell fixSeparator];
    }
}

@end

Имея это на месте, вы можете вызвать -fixSeparatosсвой tableView сразу после действия, которое заставляет их исчезнуть. В моем случае это было после звонка [tableView beginUpdates]и [tableView endUpdates].

Как я уже говорил в начале, я тестировал это как на iOS 8, так и на iOS 9. Я предполагаю, что он будет работать даже на iOS 7, но у меня нет возможности попробовать это там. Как вы, вероятно, знаете, это работает с внутренними компонентами ячейки, поэтому может перестать работать в некоторых будущих версиях. И Apple теоретически может (вероятность 0,001%) отклонить ваше приложение из-за этого, но я не понимаю, как они могут даже узнать, что вы там делаете (проверка суффикса класса не может быть обнаружена статическими анализаторами как что-то плохо, ИМО).


ДА. Это сработало для меня после перехода на последнюю версию Swift. ++ для вызова fixSeparators после каждого вызова tableView.endUpdates ().
ObjectiveTC

1
Я рад, что это помогло вам! Я действительно верю, что это лучшее решение, поэтому, надеюсь, еще больше людей откроют для себя его.
Лукас Петр

4

Основываясь на комментарии @ ortwin -gentz, это решение работает для меня в iOS 9.

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(Swift-код)

Я использую функцию fixCellsSeparator () после вызова endUpdates () в некоторых методах моего tableView, например:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

Надеюсь, это решение будет кому-то полезно!


2

Дополнение к ответу airpaulg.

Таким образом, в основном нужно реализовать два метода UITableDelegate. Вот мое решение, которое работает как на iOS7, так и на iOS6.

#define IS_OS_VERSION_7 (NSFoundationVersionNumber_iOS_6_1 < floor(NSFoundationVersionNumber))

#define UIColorFromRGB(hexRGBValue) [UIColor colorWithRed:((float)((hexRGBValue & 0xFF0000) >> 16))/255.0 green:((float)((hexRGBValue & 0xFF00) >> 8))/255.0 blue:((float)(hexRGBValue & 0xFF))/255.0 alpha:1.0]

// Это скроет пустую сетку таблицы под ячейками, если они не покрывают весь экран

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view = nil;

    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        CGFloat height = 1 / [UIScreen mainScreen].scale;
        view = [[UIView alloc] initWithFrame:CGRectMake(0., 0., 320., height)];
        view.backgroundColor = UIColorFromRGB(0xC8C7CC);
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    }
    else
    {
        view = [UIView new];
    }
    return view;
}


- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        return 1 / [UIScreen mainScreen].scale;
    }
    else
    {
        // This will hide the empty table grid below the cells if they do not cover the entire screen
        return 0.01f;
    }
}

2

Это устранило проблему для меня:

Убедитесь, что clipsToBoundsдля ячейки установлено значение ДА, а для ячейки - НЕТ contentView. Также установитеcell.contentView.backgroundColor = [UIColor clearColor];


Установка clipSubviews на false в раскадровке как для ячейки, так и для contentView устранила проблему! Нужно больше голосов за!
Brett

Мне было достаточно установки clipsToBounds на YES для ячеек.
Rene Juuse

2

Похоже, эта проблема проявляется при очень многих обстоятельствах.

Для меня это как-то связано с выбором ячеек. Я понятия не имею, почему, и у меня не было времени вникать в это слишком глубоко, но я могу сказать, что это начало происходить, когда я установил для ячейки значение « selectionStyleНет». то есть:

//This line brought up the issue for me
cell.selectionStyle = UITableViewCellSelectionStyleNone;

Я попытался использовать некоторые из вышеперечисленных методов делегата, которые включают и выключают separatorStyle свойство объекта, tableViewно, похоже, они ничего не сделали для решения моей проблемы.

Вся причина, по которой мне это было нужно, заключалась в том, что мне даже не требовался выбор ячейки.

Итак, я нашел то, что сработало для меня. Я просто отключил выделение на UITableView:

tableView.allowsSelection = NO;

Надеюсь, это кому-то поможет, если вам не нужно выбирать ячейки.


2

Я попробовал так много предложений исправить, но не могу это исправить. Наконец, я решил настроить собственную разделительную линию, как показано ниже:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

P / S: custom at willDisplayCell НЕ cellForRowAtIndexPath


1

Как ни странно, изменение separatorInsetзначения ячейки взад и вперед похоже работает:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;

1

У меня также была проблема с этим непоследовательным отображением разделительной линии в нижней части моего UITableView. Используя настраиваемое представление нижнего колонтитула, я смог создать аналогичную строку и отобразить ее поверх потенциально существующей (которая иногда отсутствовала).

Единственная проблема этого решения в том, что Apple может однажды изменить толщину линии.

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}

1

Я решил разместить эти строки кода там, где происходит обновление tableview:

self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

Например, в моем случае я поместил их сюда:

tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertIndexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

1

Перед обновлением ячейки вам необходимо удалить выделение ячейки. Тогда вы сможете восстановить выбор.

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];

1

Чтобы исправить указанную выше проблему, добавьте пустой нижний колонтитул в viewDidLoad.

UIView *emptyView_ = [[UIView alloc] initWithFrame:CGRectZero];   
emptyView_.backgroundColor = [UIColor clearColor];  
[tableView setTableFooterView:emptyView_];

Пожалуйста, не используйте приведенные выше строки в методе делегата viewForFooterInSection. Значит, не реализовывать метод viewForFooterInSection.


0

чтобы расширить ответ на airpaulg, потому что это не совсем сработало для меня ..

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

затем я заметил, что светло-серый цвет слишком темный. Я исправил это, взяв текущий цвет разделителя таблицы и используя это:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];


0

Я тоже столкнулся с этой проблемой в нашем проекте. В моем табличном представлении был tableFooterView, который мог это сделать. Я обнаружил, что разделитель под последней строкой появится, если я удалю этот tableFooterView.


0

Что имело значение для меня, так это перезагрузка строки, для которой нижняя разделительная линия не появлялась:

NSIndexPath *indexPath = 
     [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];  
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

0

Я решаю эту проблему другим способом: добавляю слой с высотой 0,5 пикселя и светло-серым цветом в tableview.tableFooterView в качестве его подслоя.

код такой:

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;

0

В своем подклассе UITableViewCell реализуйте layoutSubviews и добавьте:

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}

0

Как заметил кто-то другой, эта проблема проявляется по-разному. Я решил проблему с помощью следующего обходного пути:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

0

Просматривая ответы и решения, я пришел к таким наблюдениям:

Это кажется проблематичным как в iOS 7, так и в 8. Я заметил проблему при выборе ячейки из кода в viewDidLoadметоде так:

1) обходной путь делал это, viewDidAppear:если кто-то не возражает против заметной задержки между представлением представления и выбором ячейки

2) второе решение сработало для меня, но код выглядит немного хрупким, поскольку он основан на внутренней реализацииUITableViewCell

3) добавление собственного разделителя кажется наиболее гибким и лучшим на данный момент, но требует большего количества кода :)



0

Поскольку это все еще проблема с IOS 8, я добавлю свое решение в Swift. Установите для разделительной линии tableview значение none. Затем добавьте этот код в метод делегата cellForRowAtIndexPath. Это добавит красивый разделитель. Оператор if позволяет решить, какие ячейки должны иметь разделитель.

    var separator:UIView!
    if let s = cell.viewWithTag(1000)
    {
        separator = s
    }
    else
    {
        separator = UIView()
        separator.tag = 1000
        separator.setTranslatesAutoresizingMaskIntoConstraints(false)
        cell.addSubview(separator)

        // Swiper constraints
        var leadingConstraint = NSLayoutConstraint(item: separator, attribute: .Leading, relatedBy: .Equal, toItem: cell, attribute: .Leading, multiplier: 1, constant: 15)
        var heightConstraint = NSLayoutConstraint(item: separator, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0.5)
        var bottomConstraint = NSLayoutConstraint(item: cell, attribute: .Bottom, relatedBy: .Equal, toItem: separator, attribute: .Bottom, multiplier: 1, constant:0)
        var trailingConstraint = NSLayoutConstraint(item: cell, attribute: .Trailing, relatedBy: .Equal, toItem: separator, attribute: .Trailing, multiplier: 1, constant: 15)
        cell.addConstraints([bottomConstraint, leadingConstraint, heightConstraint, trailingConstraint])
    }

    if indexPath.row == 3
    {
        separator.backgroundColor = UIColor.clearColor()
    }
    else
    {
        separator.backgroundColor = UIColor.blackColor()
    }

0

Вот мое решение этой проблемы. После того, как вы вставите ячейку (я), перезагрузите раздел. Если перезагрузка всего раздела слишком интенсивна для вас, просто перезагрузите indexPaths вверху и внизу.

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];

0

столкнулся с аналогичной проблемой, я обнаружил, что еще одно хорошее решение, особенно если ваш dataSource небольшой, - это перезагрузить tableData при реализации -(void)scrollViewDidScroll:(UIScrollView *)scrollViewметода, вот пример:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

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

Имейте в виду, что эта функция делегата подпадает под UITableViewDelegate протокол!

Надеюсь, поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.