3. Other Utility Methods
As
you’ve seen, it’s convenient to expose a view’s origin and size in
parallel to its center, allowing you to work more natively with Core
Graphics calls. You can build on this idea to expose other properties
of the view including its width and height, as well as basic geometry like its left, right, top, and bottom points.
In
some ways, this breaks Apple’s design philosophy. This exposes items
that normally fall into structures without reflecting the structures.
At the same time, it can be argued that these elements are true view
properties. They reflect fundamental view characteristics and deserve
to be exposed as properties.
Recipe 1 provides a full view frame utility category for UIView, letting you make the choice of whether to use these properties.
Recipe 1. UIView Frame Geometry Category
@interface UIView (ViewFrameGeometry) @property CGPoint origin; @property CGSize size; @property (readonly) CGPoint bottomLeft; @property (readonly) CGPoint bottomRight; @property (readonly) CGPoint topRight; @property CGFloat height; @property CGFloat width; @property CGFloat top; @property CGFloat left; @property CGFloat bottom; @property CGFloat right; - (void) moveBy: (CGPoint) delta; - (void) scaleBy: (CGFloat) scaleFactor; - (void) fitInSize: (CGSize) aSize; @end
@implementation UIView (ViewGeometry) // Retrieve and set the origin - (CGPoint) origin { return self.frame.origin; }
- (void) setOrigin: (CGPoint) aPoint { CGRect newframe = self.frame; newframe.origin = aPoint; self.frame = newframe; }
// Retrieve and set the size - (CGSize) size { return self.frame.size; }
- (void) setSize: (CGSize) aSize { CGRect newframe = self.frame; newframe.size = aSize; self.frame = newframe; }
// Query other frame locations - (CGPoint) bottomRight { CGFloat x = self.frame.origin.x + self.frame.size.width; CGFloat y = self.frame.origin.y + self.frame.size.height; return CGPointMake(x, y); }
- (CGPoint) bottomLeft { CGFloat x = self.frame.origin.x; CGFloat y = self.frame.origin.y + self.frame.size.height; return CGPointMake(x, y); }
- (CGPoint) topRight { CGFloat x = self.frame.origin.x + self.frame.size.width; CGFloat y = self.frame.origin.y; return CGPointMake(x, y); }
// Retrieve and set height, width, top, bottom, left, right - (CGFloat) height { return self.frame.size.height; }
- (void) setHeight: (CGFloat) newheight { CGRect newframe = self.frame; newframe.size.height = newheight; self.frame = newframe; }
- (CGFloat) width { return self.frame.size.width; }
- (void) setWidth: (CGFloat) newwidth { CGRect newframe = self.frame; newframe.size.width = newwidth; self.frame = newframe; }
- (CGFloat) top { return self.frame.origin.y; }
- (void) setTop: (CGFloat) newtop { CGRect newframe = self.frame; newframe.origin.y = newtop; self.frame = newframe; }
- (CGFloat) left { return self.frame.origin.x; }
- (void) setLeft: (CGFloat) newleft { CGRect newframe = self.frame; newframe.origin.x = newleft; self.frame = newframe; }
- (CGFloat) bottom { return self.frame.origin.y + self.frame.size.height; }
- (void) setBottom: (CGFloat) newbottom { CGRect newframe = self.frame; newframe.origin.y = newbottom - self.frame.size.height; self.frame = newframe; }
- (CGFloat) right { return self.frame.origin.x + self.frame.size.width; }
- (void) setRight: (CGFloat) newright { CGFloat delta = newright - (self.frame.origin.x + self.frame.size.width); CGRect newframe = self.frame; newframe.origin.x += delta; self.frame = newframe; } @end
|