改变 UIView 位置的简单方法?

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

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

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

135018 次浏览

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

aView.center = CGPointMake(50, 200);

否则你就会按照你发布的方式来做。

aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);
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 );

我也有同样的问题,我做了一个简单的 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

我在 gcamp 的答案中发现了一个类似的方法(它也使用了一个类别) ,这对我的 给你有很大的帮助。你的情况就是这么简单:

aView.topLeft = CGPointMake(100, 200);

但是如果你想在中间水平位置和左边有另一个视图,你可以简单地:

aView.topLeft = anotherView.middleLeft;

在我的工作中,我们不使用宏。因此,@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);

为我工作 ^ _ ^

如果使用自动布局,则选定答案中的解决方案不起作用。如果您正在使用视图自动布局,请看看这个 回答

如果有人需要轻的 Swift扩展,以改变 UIView边缘容易-你可以使用 这个

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

这里是 Swift 3的答案,因为 Swift 3不接受“制造”。

aView.center = CGPoint(x: 200, Y: 200)

此后,CGRectOffset被实例方法 offsetBy所替代。

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

比如,过去

aView.frame = CGRectOffset(aView.frame, 10, 10)

现在应该是

aView.frame = aView.frame.offsetBy(dx: CGFloat(10), dy: CGFloat(10))

另一种方式:

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

这我保存大小参数和改变原点只。

@ 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

迅速

view.frame = view.frame.offsetBy(dx: offsetX, dy: offsetY)