2017-11-15 15 views

답변

0

내가 무엇을했는지 있습니다 :

  • 나는 선두와 텍스트 뷰에 하단 제약, 뒤, 내 선택의 높이와의 UIView를 만들었습니다. 이것은 '추가 읽기'버튼과 같은 추가 컨트롤을 추가하는 데에도 사용되는 그라디언트 뷰입니다.
  • viewDidLayoutSubviews()에서 나는 gradientView의 그라디언트 레이어를 만듭니다. (레이어를 생성하기 전에 레이어를 제거하거나 한 번만 추가해야합니다. 그렇지 않으면 그라디언트가 viewDidLayoutSubviews가 호출 될 때마다 어두워집니다)
  • 텍스트가 변경되면 그라디언트 뷰를 표시할지 결정합니다 또는 텍스트 뷰와 그라데이션 배경을 가진 버튼으로 복제 할 수있는 놀이터 예를 textView.contentSize.height > textView.frame.height

이것과

import UIKit 
import PlaygroundSupport 

class MyViewController : UIViewController { 

var gradientView: UIView? 
var gradient:CAGradientLayer? 

override func loadView() { 
    let view = UIView() 
    view.backgroundColor = .gray 

    let textView = UITextView() 
    textView.frame = CGRect(x: 20, y: 20, width: 200, height: 300) 
    textView.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse eu gravida ligula, vitae venenatis felis. Suspendisse volutpat posuere pretium. Pellentesque quis quam ac velit tincidunt egestas. Phasellus sed scelerisque augue, interdum luctus eros. Praesent non augue eu enim dignissim convallis. Nunc commodo eros quis quam euismod, a malesuada ipsum mattis. Sed sit amet ipsum in justo dictum rutrum a sit amet sem. Sed sit amet mi vel nulla ornare congue. Nam elit ante, aliquam id consequat ac, pretium vel augue. Vivamus hendrerit commodo lectus, vel feugiat mi tempus non. Donec porta, ipsum id porttitor sodales, tortor lectus porta lacus, quis blandit turpis enim at libero. Donec ante est, rutrum quis malesuada a, accumsan at tortor. Nam molestie commodo nulla non suscipit. Nullam pellentesque nunc quam, vitae tempus turpis sollicitudin id. Integer vel varius urna, eleifend eleifend diam." 
    textView.textColor = .black 
    view.addSubview(textView) 

    let gradientViewFrame = CGRect(x:textView.frame.origin.x, y: textView.frame.origin.y + textView.frame.height - 100, width: textView.frame.width, height: 100) 
    gradientView = UIView(frame:gradientViewFrame) 
     view.addSubview(gradientView!) 
    self.view = view 
} 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     gradient?.removeFromSuperlayer() 
     gradient = gradientView?.gradientBackground(from:.white, to: UIColor.white.withAlphaComponent(0), direction: .bottomToTop) 
    } 
} 

enum GradientDirection { 
    case leftToRight 
    case rightToLeft 
    case topToBottom 
    case bottomToTop 
} 

extension UIView { 
    func gradientBackground(from color1: UIColor, to color2: UIColor, direction: GradientDirection) -> CAGradientLayer { 
     let gradient = CAGradientLayer() 
     gradient.frame = self.bounds 
     gradient.colors = [color1.cgColor, color2.cgColor] 

     switch direction { 
     case .leftToRight: 
      gradient.startPoint = CGPoint(x: 0.0, y: 0.5) 
      gradient.endPoint = CGPoint(x: 1.0, y: 0.5) 
     case .rightToLeft: 
      gradient.startPoint = CGPoint(x: 1.0, y: 0.5) 
      gradient.endPoint = CGPoint(x: 0.0, y: 0.5) 
     case .bottomToTop: 
      gradient.startPoint = CGPoint(x: 0.5, y: 1.0) 
      gradient.endPoint = CGPoint(x: 0.5, y: 0.0) 
     case .topToBottom: 
      gradient.startPoint = CGPoint(x: 0.5, y: 0.0) 
      gradient.endPoint = CGPoint(x: 0.5, y: 1.0) 
     default: 
      break 
     } 

     self.layer.insertSublayer(gradient, at: 0) 
     return gradient 
    } 
} 

// Present the view controller in the Live View window 
PlaygroundPage.current.liveView = MyViewController() 
+0

@carien van Zyl : - 시간과 노력 그리고 해결책을 가져 주셔서 대단히 감사드립니다. 정말 고맙겠지 만 이것은 나의 요구 사항에 맞지 않습니다. 그리고 나는 이미 간단한 방법으로 그렇게했습니다. 그러나 다른 사람들에게 도움이 될 수있는 솔루션을 공유해 주셔서 감사합니다. – Sid

+0

@yacc : - 당신이 말한 것에 동의합니다. 나는 또한 숟가락으로 먹인 답이 다른 사람들이 생각하고 해결책을 찾는데 도움이되지 않을 것이라고 믿는다. 그러나이 사람은 노력을 기울였다. 그러면 다른 사람들의 노력에 감사 할 마음이 없다면 답을 내려야한다. . 존중해라. – Sid

+0

@yacc : - 나는 당신의 의견에 문제가 없다는 것을 분명히했고 나는 또한 당신이 내 질문에 대해 반대표를 던지면서 문제가 없다고 말했다. 나는 포인트에 대해서조차 신경 쓰지 않는다. 나는 점을 염려하는 탐욕스러운 사람들처럼 점수를 매기는 것은 아닙니다. 나는 당신이 대답을 downvoting하여 다른 사람의 노력을 감사하지 않았어 문제가있었습니다. 어쨌든 여기에 와서 쓰레기에 대답 할 시간이별로 없으니 일을하고 다른 사람들은 일하게하십시오. – Sid