8

我的应用程序中有以下弹出窗口:

在此处输入图像描述

但我希望它看起来像这个编辑后的图像(请注意,即使箭头也有边框):

在此处输入图像描述

这在当今可能吗?我已经在里面尝试了以下内容UIViewController

self.view.layer.borderColor = UIColor.white.cgColor
self.view.layer.borderWidth = 2

但这对箭头不起作用。这有什么转机吗?

4

3 回答 3

1

我花了一段时间,但最终我能够解决这个问题。它从一个常见的 UiPopoverPresentationController 开始。还没有什么特别的。

这个控制器在viewWillAppear和之间的某个地方隐藏自己viewDidAppear。因此,当弹出框成形时,我采用了它自己的蒙版路径,并使用它来制作带有笔划的子图层。

    override func viewWillLayoutSubviews() {
        guard let shapeLayer = view.superview?.superview?.mask?.layer as? CAShapeLayer else { return }
        let borderLayer = CAShapeLayer()
        borderLayer.path = shapeLayer.path
        borderLayer.lineWidth = 4
        borderLayer.strokeColor = borderColor.cgColor
        borderLayer.fillColor = UIColor.clear.cgColor
        borderLayer.frame = shapeLayer.bounds
        view.superview?.superview?.layer.addSublayer(borderLayer)
    }

结果看起来像这样。

结果看起来像这样

于 2021-12-16T21:31:36.577 回答
1

您是否尝试过将笔画设置为 UIBezierPath?在关闭 UIBezierPath 之前,您可以使用以下代码行来执行此操作:

Color.purple.setStroke()
bezierPath.stroke()

这是我设法在 Playground 上实现的结果:

在此处输入图像描述

然而,我意识到我不能改变它的宽度,所以我只为边框创建了另一个图层。

let borderLayer = CAShapeLayer()
borderLayer.frame = self.bounds
borderLayer.path = bezierPath.cgPath
borderLayer.lineWidth = 6.0
borderLayer.strokeColor = UIColor.black.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
self.layer.insertSublayer(borderLayer, at: 0)

操场结果:

在此处输入图像描述

我认为这应该会有所帮助,但如果没有关于如何实现形状的代码,我真的无法提出太多建议。您使用的是 UIBezierPath 还是 CGContext?

于 2018-11-01T06:59:05.453 回答
0

您可以使用ElegantPopover来完成此操作。

var design = PSDesign()
design.borders = [PSBorder(filling: .pureColor(yourBorderColor), width: yourBorderWidth)]

// Corner radius of popover
design.cornerRadius = 15

// Customise the arrow as you like
let arrow = PSArrow(height: 30, base: 60, baseCornerRadius: 5, direction: .up)

let popoverController = ElegantPopoverController(contentView: yourContentView,
                                            design: design,
                                            arrow: arrow
                                            barButtonItem: barBtnItem)

present(popoverController, animated: true)
于 2020-07-04T12:41:35.453 回答