Изменить CGRect (или любую структуру)? - PullRequest
4 голосов
/ 07 июля 2010

Я делаю это совсем немного в моем коде:

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

Есть ли способ избежать этого утомительного кода? Я пробовал этот тип вещи:

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

но я получаю Lvalue required as left operand of assignment ошибку.

Ответы [ 3 ]

8 голосов
/ 17 июля 2010

Я, наконец, последовал предложению @Dave DeLong и создал категорию. Все, что вам нужно сделать, это импортировать его в любой класс, который хочет воспользоваться этим.

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

Я мог бы высушить методы, используя блоки ... Надеюсь, я сделаю это в ближайшее время.

Позже: Я только что заметил CGRectOffset и CGRectInset, так что эту категорию можно немного убрать (если не устранить вообще).

4 голосов
/ 07 июля 2010

Да, вы должны сделать:

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

Это отстой, я знаю.Если вы делаете это много, вы можете добавить категории в UIView / NSView, чтобы изменить это для вас:

@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

И т.д.

2 голосов
/ 07 июля 2010

Проблема здесь в том, что self.sliderOne.frame.origin.x - это то же самое, что и [[self sliderOne] frame].origin.x.Как вы можете видеть, присвоение lValue здесь не то, что вы хотите сделать.

Так что нет, этот "утомительный" код необходим, хотя его можно немного сократить.

CGRect rect = thing.frame;
thing.frame = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect) + 10, etc...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...