Как я могу заполнить внутреннюю часть UIBezierPath с помощью Swift? - PullRequest
2 голосов
/ 25 мая 2020

Я пытаюсь заполнить UIBezierPath с помощью Swift 5, но когда я пытаюсь запустить свою функцию для раскрашивания путей, я получаю много ошибок. Ни один из них не является фатальным, поэтому сборка завершается успешно, но путь не отображается на экране. Прилагаю соответствующий код и две ошибки. Заранее спасибо.

func colorPaths() {    
                let path = leftCorner //Where leftCorner isa UIBezierPath

                let fillColor = UIColor.white
                fillColor.setFill()

                path.lineWidth = 1.0
                let strokeColor = UIColor.blue
                strokeColor.setStroke()

                path.fill()
                path.stroke()
            }

Ошибки:

2020-05-25 14:35:26.653308-0400 StatsApTBD[50679:10052723] [Unknown process name] CGContextSetFillColorWithColor: invalid context 0x0. Backtrace:
  <$s10StatsApTBD8HeatViewC08changeToD4MapsyyF10colorPathsL_yyF+94>
   <$s10StatsApTBD8HeatViewC08changeToD4MapsyyF+5247>
    <$s10StatsApTBD8HeatViewC8addMarksyyF+626>
     <$s10StatsApTBD8HeatViewC21viewDidLayoutSubviewsyyF+7831>
      <$s10StatsApTBD8HeatViewC21viewDidLayoutSubviewsyyFTo+43>
       <-[UIView(CALayerDelegate) layoutSublayersOfLayer:]+3013>
        <-[CALayer layoutSublayers]+255>
         <_ZN2CA5Layer16layout_if_neededEPNS_11TransactionE+517>
          <_ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE+80>
           <_ZN2CA7Context18commit_transactionEPNS_11TransactionEd+324>
            <_ZN2CA11Transaction6commitEv+643>
             <_afterCACommitHandler+160>
              <__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__+23>
               <__CFRunLoopDoObservers+430>
                <__CFRunLoopRun+1514>
                 <CFRunLoopRunSpecific+438>
                  <GSEventRunModal+65>
                   <UIApplicationMain+1621>
                    <main+75>
                     <start+1>                             1
2020-05-25 14:35:26.655966-0400 StatsApTBD[50679:10052723] [Unknown process name] CGContextSetStrokeColorWithColor: invalid context 0x0. Backtrace:
  <$s10StatsApTBD8HeatViewC08changeToD4MapsyyF10colorPathsL_yyF+175>
   <$s10StatsApTBD8HeatViewC08changeToD4MapsyyF+5247>
    <$s10StatsApTBD8HeatViewC8addMarksyyF+626>
     <$s10StatsApTBD8HeatViewC21viewDidLayoutSubviewsyyF+7831>
      <$s10StatsApTBD8HeatViewC21viewDidLayoutSubviewsyyFTo+43>
       <-[UIView(CALayerDelegate) layoutSublayersOfLayer:]+3013>
        <-[CALayer layoutSublayers]+255>
         <_ZN2CA5Layer16layout_if_neededEPNS_11TransactionE+517>
          <_ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE+80>
           <_ZN2CA7Context18commit_transactionEPNS_11TransactionEd+324>
            <_ZN2CA11Transaction6commitEv+643>
             <_afterCACommitHandler+160>
              <__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__+23>
               <__CFRunLoopDoObservers+430>
                <__CFRunLoopRun+1514>
                 <CFRunLoopRunSpecific+438>
                  <GSEventRunModal+65>
                   <UIApplicationMain+1621>
                    <main+75>
                     <start+1>                             1

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Создайте CAShapeLayer и установите путь, как показано ниже.

let width: CGFloat = 200
let height: CGFloat = 200

let shapeLayer = CAShapeLayer()
shapeLayer.frame = CGRect(x: 0, y: 0, width: width, height: height)

let path = leftCorner
shapeLayer.path = path
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.white.cgColor

Затем добавьте указанный выше shapeLayer к вашему представлению.

yourView.layer.addSublayer(shapeLayer)

Это должно показать ваш путь на экране.

0 голосов
/ 26 мая 2020
• 1000 пути туда:
import UIKit

class CanvasView: UIView {
    override func draw(_ rect: CGRect) {
        let bp = UIBezierPath(ovalIn: .init(origin: .zero, size: .init(width: 200, height: 200)))
        bp.lineWidth = 5
        UIColor.red.setFill()
        bp.fill()
        UIColor.yellow.setStroke()
        bp.stroke()
    }
}

Теперь вы можете добавить свой CanvasView в представление контроллера представления, используя раскадровку или программно:

override func viewDidLoad() {
    super.viewDidLoad()
    let drawingView = CanvasView(frame: view.frame)
    view.addSubview(drawingView)
}
...