У вас есть две проблемы.
Во-первых, вы устанавливаете shapeLayer.position = middleView.center
. center
представления - это геометрия суперпредставления. Другими словами, middleView.center
относится к view
, а не к middleView
. Но затем вы добавляете shapeLayer
в качестве подслоя middleView.layer
, что означает, что shapeLayer
нужен position
, который находится в геометрии 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
или ограничения для управления макетом фигуры, и вы можете настроить его в viewDidLoad
.
let circleView = CircleView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
circleView.center = CGPoint(x: middleView.bounds.midX, y: middleView.bounds.midY)
circleView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
circleView.shapeLayer.strokeColor = UIColor.purple.cgColor
circleView.shapeLayer.fillColor = nil
middleView.addSubview(circleView)
...
class CircleView: UIView {
override class var layerClass: AnyClass { return CAShapeLayer.self }
var shapeLayer: CAShapeLayer { return layer as! CAShapeLayer }
override func layoutSubviews() {
super.layoutSubviews()
shapeLayer.path = UIBezierPath(ovalIn: bounds).cgPath
}
}
Результат:
а>
И после поворота в альбомную:
![демонстрация в альбомной ориентации](https://i.stack.imgur.com/i8b8U.png)
person
rob mayoff
schedule
08.09.2018