开发者

Alter CGRect (or any struct)?

I do this quite a bit in my code:

self.sliderOne.frame  = CGRectMake(ne开发者_Python百科wX, 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.


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).


Yeah, you have to do:

CGRect newFrame = self.sliderOne.frame;
newFrame.origin.x = frame.size.width - MARGIN * 2 - totalWidth;
self.sliderOne.frame = newFrame;

It sucks, I know. If you find yourself doing this a lot, you may want to add categories to UIView/NSView to alter this stuff for you:

@interface UIView (FrameMucking)

- (void) setWidth:(CGFloat)newWidth;

@end

@implementation UIView (FrameMucking)
 - (void) setWidth:(CGFloat)newWidth {
  CGRect f = [self frame];
  f.size.width = newWidth;
  [self setFrame:f];
}
@end

Etc.


The issue here is that self.sliderOne.frame.origin.x is the same thing as [[self sliderOne] frame].origin.x. As you can see, assigning back to the lValue here is not what you want to do.

So no, that "tedious" code is necessary, although can be shortened up a bit.

CGRect rect = thing.frame;
thing.frame = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect) + 10, etc...);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜