es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Imagen del teléfono
Imagen del storyboard

Tags:  , ,

Answer

  1. Avatar for 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 el ViewController, la TopView tiene diferentes restricciones y por lo tanto un marco diferente al de MiddleView y BottomView.

    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ón viewDidLoad, puedes pasar el marco de TopView para crear la segunda vista.

    Función Vvp actualizada:

    func Vvp(frame: CGRect) -> UIView {
        let vistaConBezier = UIView(frame: frame)
    
        let bezierPath = UIBezierPath()
        bezierPath.move(to: CGPoint(x: 0, y: 0))
        bezierPath.addLine(to: CGPoint(x: frame.width, 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
        vistaConBezier.layer.addSublayer(shapeLayer)
    
        return vistaConBezier
    }
    

    Función viewDidLoad actualizada:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let t = Vvp(frame: TopView.frame)
        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)
    }
    

    Esto debería crear dos vistas con la misma línea.

Comments are closed.