Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - UIView frame is not equal to UIView.layer.frame

I want to draw a UIView layer but when I do it the layer frame is not equal(In Preview) to UIView frame. enter image description here

class ViewController: UIViewController {

    var graphHeight:CGFloat = 100
    var graphSize:CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()
        graphSize = self.view.frame.height/CGFloat(M_PI)
        let graphRect:CGRect = CGRectMake(0, graphHeight, self.view.frame.width, graphSize)
        let background = blueGardient()
        var theView:UIView = UIView(frame: graphRect)
        background.frame = theView.frame
        theView.backgroundColor = UIColor.yellowColor()
        theView.layer.cornerRadius = 8
        theView.layer.borderWidth = 1
        theView.layer.borderColor = UIColor.redColor().CGColor
        theView.layer.insertSublayer(background, atIndex: 0)
        self.view.addSubview(theView)

    }

    func blueGardient()->CAGradientLayer{
        let topColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.7)
        let bottomColor = UIColor(red: 0, green: 0, blue: 255, alpha: 0.9)
        let gradientColors: [CGColor] = [topColor.CGColor, bottomColor.CGColor]
        let gradientLocations: [Float] = [0.0, 1.0]
        let gradientLayer: CAGradientLayer = CAGradientLayer()
        gradientLayer.colors = gradientColors
        gradientLayer.locations = gradientLocations
        return gradientLayer
    }
}

The frame is equal

(0.0,100.0,320.0,180.800015352393)
(0.0,100.0,320.0,180.800015352393)

but not shown eauql. I try with theView.layer.frame but unsuccessfully...

like image 760
Bogdan Bogdanov Avatar asked Nov 17 '14 17:11

Bogdan Bogdanov


People also ask

What is the difference between frame and bound of a UIView?

The bounds of an UIView is the rectangle, expressed as a location (x,y) and size (width,height) relative to its own coordinate system (0,0). The frame of an UIView is the rectangle, expressed as a location (x,y) and size (width,height) relative to the superview it is contained within.

What's a difference between frame and bounds Swift?

TLDR: Bounds refers to the views own coordinate system while Frame refers to the views parent coordinate system.

What is a view's frame?

A view's frame specifies the view's size and its position relative to its superview. Because a view's size is always specified by its frame, a view is always a rectangle. A CGRect contains the members origin and size.

What is bounds in Swift?

The bounds rectangle, which describes the view's location and size in its own coordinate system.


1 Answers

The problem is because the context of each frame is different. Your view frame (theView.frame) is in the context of its superview, so the (0,100) origin means it is offset by 100 points downward from the top left of the screen. The layer's frame (background.frame) is in the context of the view it belongs to (theView), so the same (0,100) origin means the blue layer is offset by 100 points from the top left of the view.

Instead of using the view's frame, create a new rect using the size of the view's bounds and a (0,0) origin:

background.frame = CGRect(origin: CGPointZero, size: theView.bounds.size)
like image 99
Nate Cook Avatar answered Oct 09 '22 18:10

Nate Cook