Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alter CGRect (or any struct)?

I do this quite a bit in my code:

self.sliderOne.frame  = CGRectMake(newX, 0, self.sliderOne.frame.size.width, self.sliderOne.frame.size.height); 

Is there any way to avoid this tedious code? I have tried this type of thing:

self.sliderOne.frame.origin.x = newX;

but I get a Lvalue required as left operand of assignment error.

like image 462
Dan Rosenstark Avatar asked Dec 09 '22 15:12

Dan Rosenstark


1 Answers

I finally followed @Dave DeLong's suggestion and made a category. All you have to do is import it in any class that wants to take advantage of it.

UIView+AlterFrame.h

#import <UIKit/UIKit.h>

@interface UIView (AlterFrame)

- (void) setFrameWidth:(CGFloat)newWidth;
- (void) setFrameHeight:(CGFloat)newHeight;
- (void) setFrameOriginX:(CGFloat)newX;
- (void) setFrameOriginY:(CGFloat)newY;

@end

UIView+AlterFrame.m

#import "UIView+AlterFrame.h"

@implementation UIView (AlterFrame)

    - (void) setFrameWidth:(CGFloat)newWidth {
        CGRect f = self.frame;
        f.size.width = newWidth;
        self.frame = f;
    }

    - (void) setFrameHeight:(CGFloat)newHeight {
        CGRect f = self.frame;
        f.size.height = newHeight;
        self.frame = f;
    }

    - (void) setFrameOriginX:(CGFloat)newX {
        CGRect f = self.frame;
        f.origin.x = newX;
        self.frame = f;
    }

    - (void) setFrameOriginY:(CGFloat)newY {
        CGRect f = self.frame;
        f.origin.y = newY;
        self.frame = f;
    }

@end

I could DRY up the methods using blocks... I'll do that at some point soon, I hope.

Later: I just noticed CGRectOffset and CGRectInset, so this category could be cleaned up a bit (if not eliminated altogether).

like image 162
Dan Rosenstark Avatar answered Dec 12 '22 03:12

Dan Rosenstark