更改UIView位置的简单方法?


72

我使用以下代码更改了UIView的位置,而没有更改视图的大小。

CGRect f = aView.frame;
f.origin.x = 100; // new x
f.origin.y = 200; // new y
aView.frame = f;

是否有更简单的方法仅更改视图位置?


3
注意:如果您使用的是自动版式,则无法使用。
安东·卡什波尔

Answers:


228
aView.center = CGPointMake(150, 150); // set center

要么

aView.frame = CGRectMake( 100, 200, aView.frame.size.width, aView.frame.size.height ); // set new position exactly

要么

aView.frame = CGRectOffset( aView.frame, 10, 10 ); // offset by an amount

编辑:

我还没有编译它,但是它应该可以工作:

#define CGRectSetPos( r, x, y ) CGRectMake( x, y, r.size.width, r.size.height )

aView.frame = CGRectSetPos( aView.frame, 100, 200 );

2
是的,我也赞成CGRectOffset。它减少了胡言乱语。乱码我现在可以花点其他钱了。
thomax

3
对于Swift 3:aView.frame = aView.frame.offsetBy(dx:100,dy:100)
Sulabh

有没有办法动画化此过渡-它看起来很刺耳。
放出鸽子

32

我有同样的问题。我做了一个简单的UIView类别来解决此问题。

。H

#import <UIKit/UIKit.h>


@interface UIView (GCLibrary)

@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;

@end

.m

#import "UIView+GCLibrary.h"


@implementation UIView (GCLibrary)

- (CGFloat) height {
    return self.frame.size.height;
}

- (CGFloat) width {
    return self.frame.size.width;
}

- (CGFloat) x {
    return self.frame.origin.x;
}

- (CGFloat) y {
    return self.frame.origin.y;
}

- (CGFloat) centerY {
    return self.center.y;
}

- (CGFloat) centerX {
    return self.center.x;
}

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

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

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

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

@end

我最终做出了完全相同的类方法,但没有想到将其附加到原始UIView类中!+1实用又聪明!
NoodleOfDeath 2014年

如果您需要这样的东西Swift-请随时使用github.com/katleta3000/UIView-Frame
katleta3000

13

UIView也有一个center属性。如果您只想移动位置而不是调整大小,则可以更改它-例如:

aView.center = CGPointMake(50, 200);

否则,您将按照发布方式进行操作。


7

我发现了一个类似的方法(它使用类别为好)与gcamp的答案,帮助我大大这里。您的情况就是这样简单:

aView.topLeft = CGPointMake(100, 200);

但是,例如,如果您想使水平居中并在左侧使用其他视图,则可以简单地:

aView.topLeft = anotherView.middleLeft;

6

使用自动版式时,所选答案中的解决方案不起作用。如果您正在使用“自动布局”视图,请查看此答案




2

在我的工作中,我们不使用宏。因此,@ TomSwift提供的解决方案启发了我。我看到了CGRectMake的实现,并创建了相同的CGRectSetPos,但没有宏。

CG_INLINE CGRect
CGRectSetPos(CGRect frame, CGFloat x, CGFloat y)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = frame.size.width; rect.size.height = frame.size.height;
  return rect;
}

要使用我只放框架X和Y

viewcontroller.view.frame = CGRectSetPos(viewcontroller.view.frame, 100, 100);

为我工作^ _ ^


我检查了CGRectMake的原始实现,这就是他们(苹果公司)这样做的方式。所以我跟随他们。
gzfrancisco 2015年

2

如果有人需要轻度Swift延伸以UIView轻松更改页边距-您可以使用

view.top = 16
view.right = self.width
view.bottom = self.height
self.height = view.bottom

2

@TomSwift Swift 3答案

aView.center = CGPoint(x: 150, y: 150); // set center

要么

aView.frame = CGRect(x: 100, y: 200, width: aView.frame.size.width, height: aView.frame.size.height ); // set new position exactly

要么

aView.frame = aView.frame.offsetBy(dx: CGFloat(10), dy: CGFloat(10)) // offset by an amount


0

另一种方式:

CGPoint position = CGPointMake(100,30);
[self setFrame:(CGRect){
      .origin = position,
      .size = self.frame.size
}];

我保存尺寸参数并仅更改原点。


0

迅速

view.frame = view.frame.offsetBy(dx: offsetX, dy: offsetY)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.