我创建了一个任意视图
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时,圆距视图的底部很远。您可以将位置设置在子视图的中心吗?
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)
如何在此视图中将此圆居中?
答案 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
(或frame
或bounds
)是一个坏主意在布局阶段。通常,您可以通过设置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
结果:
旋转到风景后: