¿Alguien entiende esta paradoja con los “swift frames”?
En UIKIT tengo dos vistas principales de uiview y uiview instaladas con el storyboard en la parte superior con alto en 1/3 de la vista principal.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var TopView: UIView!
@IBOutlet weak var MiddleView: UIView!
@IBOutlet weak var BottomView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let t = Vvp(inView: TopView)
TopView.addSubview(t)
let bezierPath = UIBezierPath()
bezierPath.move(to: CGPoint(x: 0, y: 0))
bezierPath.addLine(to: CGPoint(x: TopView.frame.maxX, y: 0))
bezierPath.close()
let shapeLayer = CAShapeLayer()
shapeLayer.path = bezierPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.red.cgColor
shapeLayer.lineWidth = 1.0
TopView.layer.addSublayer(shapeLayer)
}
}
Segunda vista:
func Vvp(inView: UIView) -> UIView {
let viewWithBeizer = UIView(frame: inView.frame)
let bezierPath = UIBezierPath()
bezierPath.move(to: CGPoint(x: 0, y: 0))
bezierPath.addLine(to: CGPoint(x: inView.frame.maxX, y: 0))
bezierPath.close()
let shapeLayer = CAShapeLayer()
shapeLayer.path = bezierPath.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.blue.cgColor
shapeLayer.lineWidth = 1.0
viewWithBeizer.layer.addSublayer(shapeLayer)
return viewWithBeizer
}
Ambas vistas funcionan con el mismo marco, en el storyboard todos los bordes están en cero. ¿Por qué las líneas no son iguales?
davy.ai
La razón por la que las líneas no son iguales es porque las dos vistas tienen diferentes marcos. En la función
Vvp
, la vista creada tiene el mismo marco que la vista de entrada (inView
). Sin embargo, en elViewController
, laTopView
tiene diferentes restricciones y por lo tanto un marco diferente al deMiddleView
yBottomView
.Para solucionar este problema, puedes actualizar la función
Vvp
para que acepte un parámetro de marco en lugar de un parámetro de vista. Luego, en la funciónviewDidLoad
, puedes pasar el marco deTopView
para crear la segunda vista.Función
Vvp
actualizada:Función
viewDidLoad
actualizada:Esto debería crear dos vistas con la misma línea.