iOS CALayer маска странная половина пиксельной линии - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно разрезать прозрачную дугу от 0 до пи через весь текстовый слой. Код, приведенный выше, работает нормально, кроме одной вещи. У меня есть линия небольшой ширины при выполнении CABasicAnimation для маскировки CALayer, и нет странной линии в состоянии ожидания.

Полупиксельное изображение линии

Не могу понять, почему он показывает, потому что теоретически его вообще не должно быть видно ...

Вот код моей детской площадки:

import UIKit
import PlaygroundSupport

let rootView = UIView(frame: CGRect(x: 0, y: 0,
                                    width: 200,
                                    height: 200))
rootView.backgroundColor = .gray

let uiview = UIButton(frame: CGRect(x: 0,
                                  y: 0,
                                  width: 200,
                                  height: 200))
uiview.setTitle("H", for: .normal)
uiview.titleLabel?.font = UIFont.boldSystemFont(ofSize: 200)
uiview.setTitleColor(.black, for: .normal)
uiview.backgroundColor = UIColor.green
uiview.layer.cornerRadius = 100
uiview.layer.masksToBounds = true
rootView.addSubview(uiview)

let center = CGPoint(x: uiview.bounds.width / 2,
                     y: uiview.bounds.height / 2)

let path = UIBezierPath(arcCenter: center,
                        radius: 80,
                        startAngle: 0,
                        endAngle: .pi,
                        clockwise: true)
path.append(UIBezierPath(arcCenter: center,
                         radius: 78,
                         startAngle: -1,
                         endAngle: .pi,
                         clockwise: true))
path.append(UIBezierPath(rect: uiview.bounds))

let maskLayer = CAShapeLayer()
maskLayer.frame = uiview.bounds
maskLayer.path = path.cgPath
maskLayer.backgroundColor = UIColor.clear.cgColor
maskLayer.fillRule = kCAFillRuleEvenOdd
maskLayer.lineWidth = 0

uiview.layer.mask = maskLayer

let rotation = CABasicAnimation(keyPath: "transform.rotation")
rotation.fromValue = 0.0
rotation.toValue = Double.pi * 2
rotation.duration = 10
rotation.repeatCount = 2
maskLayer.add(rotation, forKey: nil)


PlaygroundPage.current.liveView = rootView

Как я могу решить это?

1 Ответ

0 голосов
/ 30 апреля 2018

С небольшими изменениями, например:

path.append(UIBezierPath(arcCenter: center,
                         radius: 78,
                         startAngle: .pi,
                         endAngle: 0,
                         clockwise: false))

последние несколько секунд анимации выглядят так:

last few seconds of animation

Две дуги были смещены друг к другу.

Итак, что изменилось:

  • вторая дуга получила начальный угол PI

  • он получил конечный угол 0

  • по часовой стрелке имеет значение false

Это то, что вы ищете?

...