简单的方法来改变UIView的位置?

Seu*_*oon 71 iphone uiview

我使用以下代码更改UIView的位置,而不更改视图的大小.

CGRect f = aView.frame;
f.origin.x = 100; // new x
f.origin.y = 200; // new y
aView.frame = f;
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ift 225

aView.center = CGPointMake(150, 150); // set center
Run Code Online (Sandbox Code Playgroud)

要么

aView.frame = CGRectMake( 100, 200, aView.frame.size.width, aView.frame.size.height ); // set new position exactly
Run Code Online (Sandbox Code Playgroud)

要么

aView.frame = CGRectOffset( aView.frame, 10, 10 ); // offset by an amount
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

aView.frame = CGRectSetPos( aView.frame, 100, 200 );
Run Code Online (Sandbox Code Playgroud)

  • 对于Swift 3:aView.frame = aView.frame.offsetBy(dx:100,dy:100) (3认同)
  • 是的,我也为 CGRectOffset 点赞。它减少了胡言乱语。胡言乱语我现在可以花在别的东西上了。 (2认同)

gca*_*amp 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
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)


lxt*_*lxt 12

UIView也有一处center房产.如果你只想移动位置而不是调整大小,你可以改变它 - 例如:

aView.center = CGPointMake(50, 200);

否则你会按照发布的方式进行.


Med*_*eda 6

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

aView.topLeft = CGPointMake(100, 200);
Run Code Online (Sandbox Code Playgroud)

但是如果你想要例如水平居中并且左边有另一个视图你可以简单地:

aView.topLeft = anotherView.middleLeft;
Run Code Online (Sandbox Code Playgroud)


小智 6

使用Autolayout时,所选答案中的解决方案不起作用.如果您使用Autolayout查看视图,请查看此答案.


Roo*_*ope 5

CGRectOffset此后已被instance方法代替offsetBy

https://developer.apple.com/reference/coregraphics/cgrect/1454841-offsetby

例如,以前是

aView.frame = CGRectOffset(aView.frame, 10, 10)
Run Code Online (Sandbox Code Playgroud)

现在将是

aView.frame = aView.frame.offsetBy(dx: CGFloat(10), dy: CGFloat(10))
Run Code Online (Sandbox Code Playgroud)