I want to draw a UIView layer but when I do it the layer frame is not equal(In Preview) to UIView frame.
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...
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.
TLDR: Bounds refers to the views own coordinate system while Frame refers to the views parent coordinate system.
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.
The bounds rectangle, which describes the view's location and size in its own coordinate system.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With