当有其他内容时,Scrollview顶部/机器人的渐变

时间:2016-07-14 14:16:31

标签: ios swift uiscrollview gradient cagradientlayer

我有一个scrollview> ContentView> TextLabel设置,其中渐变显示但不按我想要的方式工作。这是一个清晰的背景scrollView,所以我正在寻找的是一个清晰的渐变掩码文本。我found something类似于我在Objective-C中寻找但该线程没有Swift解决方案。

我的最终目标似乎是大多数人可能会使用的东西,所以我很惊讶还没有Swift版本。我正在尝试编写的功能是:

  1. 有时文本完全适合scrollView的固定大小,所以不应该有渐变。
  2. 如果文本超出了可以适应的范围,因此其中一些文本位于scrollView的底部截止值下方,则视图的底部应淡出以清除。
  3. 一旦用户向下滚动并且顶部应该淡出,表明还有更多。
  4. 我尝试使用此代码来处理子弹#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 with gradient

    如果我删除.superview并将其直接应用于scrollView,它只会淡化可见的初始部分下方的所有文本:

    scrollview gradient not working

    有没有人知道如何正确实现这个?

1 个答案:

答案 0 :(得分:2)

想出来。首先,确保添加了正确的视图层次结构。滚动视图需要嵌入到容器视图中(这将应用于渐变):

Gradient View Hierarchy

  1. 热门/容器视图:根据需要进行设置
  2. Scrollview:将所有边缘固定到容器(总共4个约束)
  3. Scrollview内容视图:图钉边缘+中心X(总共5个约束)
  4. 标签:针边(4个总约束)
  5. 将“scrollViewDelegate”添加到ViewController类:

    class ViewController_WithScrollView: UIViewController, UIScrollViewDelegate {
       ....
    

    使用IBOutlets连接上面列出的四个视图。然后,在viewDidLoad中设置scrollView委托:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        yourScrollView.delegate = self
        //+All your other viewDidLoad stuff
    }
    

    然后实现scrollViewDidScroll func,由于你上面的工作,它将自动运行。

    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
    }
    

    应该这样做!