2016-07-14 2 views
4

У меня есть scrollview> ContentView> Настройка TextLabel, где появляется градиент, но не работает, как я этого хочу. Это чистый фон scrollView, поэтому все, что я ищу, - это прозрачная градиентная маска над текстом. I found something похоже на Я ищу в Objective-C, но этот поток не имеет решения Swift.Gradient at Top/Bot of Scrollview Когда есть дополнительный контент

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

  1. Иногда текст прекрасно вписывается в фиксированный размер scrollView, поэтому градиент не должен быть.
  2. Когда текст длиннее, чем может поместиться, и поэтому некоторые из них находятся ниже нижней границы прокрутки, нижняя часть представления должна исчезнуть, чтобы очистить.
  3. Как только пользователь прокручивается вниз, а верхняя часть должна исчезать, указывая на то, что выше.

Я попробовал этот код, чтобы справиться с пулей # 2:

 let gradient = CAGradientLayer() 
     gradient.frame = self.bio_ScrollView.superview!.bounds ?? CGRectNull 
     gradient.colors = [UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] 
     //gradient.locations = [0, 0.15, 0.25, 0.75, 0.85, 1.0] 
     gradient.locations = [0.6, 1.0] 
     self.bio_ScrollView.superview!.layer.mask = gradient 

Но она исчезает все, включая кнопку под ним, что явно не в Scrollview:

scrollView with gradient

Если я удаляю .superview и применяю его непосредственно к scrollView, он просто угасает весь текст ниже начальной части, которая была видна:

scrollview gradient not working

Кто-нибудь знает что-либо о том, как правильно реализовать это?

ответ

1

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

Gradient View Hierarchy

  1. Top/вид контейнера: Установите вверх, как вы
  2. Scrollview: Pin всех ребер в контейнер (4 всего ограничения)
  3. ScrollView вид содержания: Pin края + Центр X (5 всего ограничение)
  4. Этикетка: Pin края (4 всего ограничение)

Добавить "scrollViewDelegate" к классу ViewController:

class ViewController_WithScrollView: UIViewController, UIScrollViewDelegate { 
    .... 

Подключите четыре вида перечисленные выше IBOutlets. Затем установите Scrollview делегат в пределах viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    yourScrollView.delegate = self 
    //+All your other viewDidLoad stuff 
} 

затем реализовать FUNC scrollViewDidScroll, которая будет работать автоматически, благодаря работе, которую вы делали выше.

func scrollViewDidScroll (scrollView: UIScrollView) { 
    if scrollView.isAtTop { 
     self.applyGradient_To("Bot") 
    } else if scrollView.isAtBottom { 
     self.applyGradient_To("Top") 
    } else { 
     self.applyGradient_To("Both") 
    } 
} 

Затем добавьте этот магический код градиента:

func applyGradient_To (state: String) { 
    let gradient = CAGradientLayer() 
    gradient.frame = self.yourScrollView.superview!.bounds ?? CGRectNull 

    switch state { 
    case "Top": 
     gradient.colors = [UIColor.clearColor().CGColor,UIColor.whiteColor().CGColor] 
     gradient.locations = [0.0,0.2] 
    case "Bot": 
     gradient.colors = [UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] 
     gradient.locations = [0.8,1.0] 
    default: 
     gradient.colors = [UIColor.clearColor().CGColor,UIColor.whiteColor().CGColor,UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] 
     gradient.locations = [0.0,0.2,0.8,1.0] 
    } 
    self.yourScrollView.superview!.layer.mask = nil 
    self.yourScrollView.superview!.layer.mask = gradient 
} 

Это должно сделать это!

+0

Работал для меня, как только я добавил расширение UIScrollView для использования свойства isAtTop. http://stackoverflow.com/a/14745900/4228969 – toddg

Смежные вопросы