CAShapeLayer形状可以在子视图中居中吗?

时间:2018-09-08 07:09:23

标签: swift cashapelayer caanimation

我创建了一个任意视图

let middleView = UIView(
    frame: CGRect(x: 0.0,
                  y: view.frame.height/4,
                  width: view.frame.width,
                  height: view.frame.height/4))
middleView.backgroundColor = UIColor.blue
view.addSubview(middleView)

然后我使用UIBezierPath创建了一个圆;但是,当我将位置设置为middleView.center时,圆距视图的底部很远。您可以将位置设置在子视图的中心吗?

iPhone 8 Plus with view and uncentered circle

let shapeLayer = CAShapeLayer()
let circlePath = UIBezierPath(
        arcCenter: .zero,
        radius: 100,
        startAngle: CGFloat(0).toRadians(),
        endAngle: CGFloat(360).toRadians(),
        clockwise: true)
shapeLayer.path = circlePath.cgPath
shapeLayer.strokeColor = UIColor.purple.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.position = middleView.center
middleView.layer.addSublayer(shapeLayer)

如何在此视图中将此圆居中?

1 个答案:

答案 0 :(得分:3)

您有两个问题。

首先,您要设置shapeLayer.position = middleView.center。视图的center是超级视图的几何。换句话说,middleView.center相对于view,而不是middleView。但是随后您要添加shapeLayer作为middleView.layer的子层,这意味着shapeLayer需要一个position几何形状而不是{ {1}}的几何。您需要将middleView设置为view的中心:

shapeLayer.position

第二,您没有说这是在哪里做的。我的猜测是您正在middleView.bounds中进行操作。但这还为时过早。在shapeLayer.position = CGPoint(x: middleView.bounds.midX, y: middleView.bounds.midY) 中,从情节提要加载的视图仍具有在情节提要中给出的帧,并且尚未针对当前设备的屏幕尺寸进行布局。因此,如果您不执行某些操作来确保正确放置内容,请查看viewDidLoad中的viewDidLoad(或framebounds)是一个坏主意在布局阶段。通常,您可以通过设置center或创建约束来做到这一点。示例:

viewDidLoad

但是,autoresizingMask不属于视图,因此它没有let middleView = UIView( frame: CGRect(x: 0.0, y: view.frame.height/4, width: view.frame.width, height: view.frame.height/4)) middleView.backgroundColor = UIColor.blue middleView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleBottomMargin] view.addSubview(middleView) 并且不能被约束。您必须将其布置在代码中。您可以这样做,但是最好仅使用视图来管理形状层。这样,您可以使用shapeLayer或约束条件来控制形状的布局,并可以在autoresizingMask中进行设置。

autoresizingMask

结果:

demo

旋转到风景后:

demo in landscape