Сторона tableViewCell обрезается при применении градиентной маски

#ios #swift #tableview #gradient #mask

#iOS #swift #просмотр таблицы #градиент #маска

Вопрос:

Мой TableView находится в пустом представлении содержимого с ограничениями, удерживающими его на месте. Таблица будет нормально функционировать в контейнере сама по себе, но как только я применяю градиент, используя приведенный ниже код, градиент работает отлично, за исключением того, что правая часть моих TableViewCells обрезается. Это происходит только при применении градиента. Любые рекомендации будут оценены.

Перед добавлением градиента представление таблицы выглядит следующим образом:

Просмотр таблицы с полными TableViewCells

После добавления градиента представление таблицы выглядит следующим образом:

Просмотр таблицы с вырезанными TableViewCells

Это код, который я использую для применения градиента.

         let gradientLayerMask = CAGradientLayer()
    gradientLayerMask.frame = gradientMask.bounds
    gradientLayerMask.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, UIColor.white.cgColor, UIColor.clear.cgColor]
    gradientLayerMask.locations = [0.0,0.1,0.9,1.0]

    gradientMask.layer.mask = gradientLayerMask

    exerciseTable.contentInset = UIEdgeInsets(top: 15, left: 0, bottom: 0, right: 0)
  

Комментарии:

1. Для чего предназначен градиент? Я не вижу эффекта градиента. Очевидно, вы просто маскируете правую часть таблицы.

2. @matt Градиент предназначен для затенения верхней и нижней части табличного представления, поэтому при прокрутке он выглядит более плавным, а не сплошной линией, на которой все исчезает.

3. Ну, я не вижу, чтобы это делало это. В любом случае очевидно, что ее ширина меньше ширины табличного представления.

4. @matt Я настроил вертикальную вставку так, чтобы, когда tableview не прокручивается, градиент не был виден, поэтому сам градиент не был виден до прокрутки. Я согласен с тем, что вы говорите о том, что он более узкий, чем сам tableview, однако ни в коем случае в коде я не менял размер программно. Я пересмотрел все свои ограничения, чтобы убедиться, что они также были правильными. Тем не менее, я продолжу смотреть, не изменил ли я случайно размеры в другом месте.

5. Но вы не показали, где находится ваш код. Если viewDidLoad это слишком рано.

Ответ №1:

Установите некоторую задержку для кода градиента

 func delay(time: Double, closure:
    @escaping ()->()) {

    DispatchQueue.main.asyncAfter(deadline: .now()   time) {
        closure()
    }

}
  

Используйте этот способ.

 delay(time: 0.2) {
    //gradient code
}
  

Я надеюсь, что это сработает для вас.

Комментарии:

1. Я попробую это сделать. Могу ли я спросить, почему это будет иметь эффект? Есть ли какое-то время анимации, влияющее на отображение, о котором я не знаю?

2. Всякий раз, когда вы разрабатываете пользовательский интерфейс для устройств небольшого размера, таких как iPhone 5 SE, и работаете на большом устройстве, таком как iPhone 6, пользовательскому интерфейсу потребуется некоторое время, чтобы получить исходный кадр, поэтому здесь вам нужно установить некоторую задержку для изменения пользовательского интерфейса, связанного с градиентом.

3. Это сработало! Я не знал об этом, спасибо, что дали мне знать. Это странно, потому что я разрабатывал это на iPhone X в IB, но работал на симуляторе iPhone XR. Очень признателен, спасибо!

4. Правильный способ — поместить код в нужное место.