代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

更改CGRect(或任何结构)?

  •  4
  • Dan Rosenstark  · 技术社区  · 14 年前

    我在代码中经常这样做:

    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 回复  |  直到 11 年前
        1
  •  8
  •   Dan Rosenstark    13 年前

    我终于听从了@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 ,所以这个类别可以被清理一点(如果不完全消除的话)。

        2
  •  4
  •   Dave DeLong    14 年前

    是的,你必须做到:

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

    @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
    

    等。

        3
  •  2
  •   Joshua Weinberg    14 年前

    这里的问题是 self.sliderOne.frame.origin.x 是同一件事 [[self sliderOne] frame].origin.x . 如您所见,在这里为左值赋值并不是您想要做的。

    所以不,虽然代码可以缩短一点,但是“冗长”的代码是必要的。

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