Неправильный цвет верхней и нижней строки с UIGraphicsGetCurrentContext - PullRequest
0 голосов
/ 26 июня 2018

В проекте используется ASDK (текстура). Есть основной узел, у него есть подузел, при определенных обстоятельствах необходимо показать внешнюю границу подузла, в этом проекте это делается путем добавления граничного узла и UIGraphicsGetCurrentContext, также задача состоит в том, чтобы ограничить ширину линии границы быть одинаковым на всех устройствах независимо от UIScreen.main.scale. Я сделал тестовый код, и все работает нормально, за исключением того, что нижняя и верхняя линии имеют меньшую ширину, чем боковые линии (которые отображаются правильно). Подскажите пожалуйста как это исправить? Я не могу распространять скриншот всего экрана, но я загрузил часть, чтобы я мог показать, в чем проблема. Вы можете увидеть зеленый цвет в нижней строке, это не должно быть.

enter image description here

private func enableEditingMode() {
        let solidBorderStyle = BorderStyle.solid
        let border = ASBorderNode(shapeType: self.shapeType, borderType: solidBorderStyle)
        border.frame = ASBorderNode.calculateFrame(self.shapeType, borderType: solidBorderStyle, superView: frame)
        supernode?.insertSubnode(border, at: 0)
    }

enum BorderStyle {
    case dashed
    case solid
    case solidLight

    var lineWidth: CGFloat {
        switch self {
        case .dashed:
            return 1
        case .solid:
            return 6 / UIScreen.main.scale
        case .solidLight:
            return 2
        }
    }

}

class ASBorderNode: ASDisplayNode {

    private (set) var shapeType: TemplateLayoutElement.Shape?
    private (set) var borderType: BorderStyle


    init(shapeType:TemplateLayoutElement.Shape?, borderType:BorderStyle = .dashed) {
        self.borderType = borderType
        self.shapeType = shapeType
        super.init()
        self.isOpaque = false
    }

    class func calculateFrame(_ shapeType: TemplateLayoutElement.Shape?, borderType: BorderStyle, superView frame: CGRect) -> CGRect {
        switch borderType {
        case .solid:
            let lineWidth = borderType.lineWidth //* UIScreen.main.scale
            let widthHeightValue = lineWidth * 2
            return CGRect(x: -lineWidth + frame.origin.x, y: -lineWidth + frame.origin.y, width: frame.width + widthHeightValue, height: frame.height + widthHeightValue)
        default:
            assertionFailure("Implement for specific style")
            return .zero
        }
    }

    override class func draw(_ bounds: CGRect, withParameters parameters: Any?, isCancelled isCancelledBlock: () -> Bool, isRasterizing: Bool) {
        if let context = UIGraphicsGetCurrentContext(),
            let parameters = parameters as? ASBorderNode {

            switch parameters.borderType {
            case .dashed:
                break
            case .solid:
                context.setStrokeColor(UIColor.black.withAlphaComponent(0.5).cgColor)
                context.setFillColor(UIColor.clear.cgColor)
                context.setLineWidth(parameters.borderType.lineWidth)
            case .solidLight:
                break
            }

            switch parameters.shapeType {
            case .circle?:
                break
            default:
                switch parameters.borderType {
                case .solid:
                    debugPrint("Bounds", bounds)
                    let frame = bounds.insetBy(dx: parameters.borderType.lineWidth / UIScreen.main.scale, dy: parameters.borderType.lineWidth / UIScreen.main.scale)
                    debugPrint("insetBy", frame)
                    context.addRect(frame)
                default:
                    break
                }
            }

            context.strokePath()
        }
    }

    override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? {
        return self
    }

}

Обновление 1 : еще один пример enter image description here

1 Ответ

0 голосов
/ 27 июня 2018

Я верю, что вы видите артефакт инсульта. Единственный способ, которым я знаю, как их избежать, это построить путь, который соответствует желаемой форме обводки, и использовать fill (чтобы вы накладывали наложенные объекты друг на друга, а не просто поглаживали основание). путь).

...