[iOS] Path를 백분율로 그리기
19031 단어 SwiftCAShapeLayerUIBezierPathiOS
먼저
나는 애니메이션으로 Path를 그리고 싶지 않고 백분율로 그리고 싶다.
Path 백분율을 지정하면 아래의 GIF 애니메이션처럼 슬라이더와 연동하여 그릴 수 있습니다.
어떻게 설치했어
실현시의 요점은 다음과 같다.
CAShapeLayer
의 UIView
에서 - drawRect
인스턴스 그리기-
CAShapeLayer
의 strokeEnd
를 사용하여 백분율 지정class PathStokeAdjustableView: UIView {
private let shapeLayer = CAShapeLayer()
private var _stroke: CGFloat = 0 {
didSet {
shapeLayer.strokeEnd = _stroke
}
}
var stroke: CGFloat {
set {
_stroke = max(0, min(1, newValue))
}
get {
return _stroke
}
}
//MARK: - XibやStroyboardから呼ばれた時
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
super.awakeFromNib()
layer.addSublayer(shapeLayer)
shapeLayer.strokeEnd = 0
layoutIfNeeded()
}
override func layoutSubviews() {
super.layoutSubviews()
setNeedsDisplay()
}
//MARK: - コードで生成された時
init() {
super.init(frame: .zero)
layer.addSublayer(shapeLayer)
shapeLayer.strokeEnd = 0
}
override init(frame: CGRect) {
super.init(frame: frame)
layer.addSublayer(shapeLayer)
shapeLayer.strokeEnd = 0
}
//MARK: - Pathの描画
override func drawRect(rect: CGRect) {
UIColor.whiteColor().setFill()
shapeLayer.lineWidth = 10
shapeLayer.strokeColor = UIColor.blackColor().CGColor
shapeLayer.fillColor = UIColor.whiteColor().CGColor
shapeLayer.path = path().CGPath
}
}
extension PathStokeAdjustableView {
func path() -> UIBezierPath {
let path = UIBezierPath()
path.moveToPoint(CGPoint(x: CGRectGetMinX(bounds), y: CGRectGetMinY(bounds)))
path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds), y: CGRectGetMinY(bounds)))
path.addLineToPoint(CGPoint(x: CGRectGetMaxX(bounds), y: CGRectGetMaxY(bounds)))
path.addLineToPoint(CGPoint(x: CGRectGetMinX(bounds), y: CGRectGetMaxY(bounds)))
path.addLineToPoint(CGPoint(x: CGRectGetMinX(bounds), y: CGRectGetMinY(bounds)-5))
return path
}
}
Storyboard
에 UIView
와 UISlider
를 적당히 추가하십시오.이후
PathStokeAdjustableView
에서 지정Storyboard
하느냐ViewController
에서 지정addSubView
하느냐에 따라 쓰기 방법이 달라진다.Storyboard를 통해 지정된 경우
다음 캡처와 같이
UIView
에 추가된 Custom Class를 지정하십시오.PathStokeAdjustableView
자체의 실현은 ViewController
의 값을 받았을 때Slider
의 값으로 받은 것만 PathStokeAdjustableView
의 실례에 맡긴다.class ViewController: UIViewController {
@IBOutlet weak var pathView: PathStokeAdjustableView!
@IBAction func sliderValueChanged(sender: AnyObject) {
guard let slider = sender as? UISlider else {
return
}
pathView.stroke = CGFloat(slider.value)
}
}
stroke에서 생성된 상황
ViewController
중 추가Storyboard
중의 커스텀 클래스는 변경하지 마시고 UIView
상태를 유지하십시오.UIView
를 UIView
로 사용한다.pathContainerView
실례를 생성하고 사용하세요PathStokeAdjustableView
등AutoLayout
.틀림없이
pathContainerView
에 수치를 전달하는 실현이다.class ViewController: UIViewController {
@IBOutlet weak var pathContainerView: UIView!
private let pathView = PathStokeAdjustableView()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pathView.translatesAutoresizingMaskIntoConstraints = false
pathContainerView.addSubview(pathView)
pathContainerView.addConstraints([
NSLayoutConstraint(item: pathView, attribute: .Top, relatedBy: .Equal, toItem: pathContainerView, attribute: .Top, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pathView, attribute: .Right, relatedBy: .Equal, toItem: pathContainerView, attribute: .Right, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pathView, attribute: .Left, relatedBy: .Equal, toItem: pathContainerView, attribute: .Left, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pathView, attribute: .Bottom, relatedBy: .Equal, toItem: pathContainerView, attribute: .Bottom, multiplier: 1, constant: 0)
])
}
@IBAction func sliderValueChanged(sender: AnyObject) {
guard let slider = sender as? UISlider else {
return
}
pathView.stroke = CGFloat(slider.value)
}
}
주의점
Path
addSubview
는 지원되지만 stroke
는 지원되지 않습니다.최후
Path를 백분율로 그리도록 지정하면
stroke
값과 일치할 뿐만 아니라 fill
같은 스크롤 막대와 함께 Path를 그릴 수 있습니다.
Reference
이 문제에 관하여([iOS] Path를 백분율로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/marty-suzuki/items/7b3aadaf5e10fff7ca56텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)