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

时间:2011-03-01 22:18:21

标签: iphone uiview

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

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

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

13 个答案:

答案 0 :(得分:221)

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 );

答案 1 :(得分: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

答案 2 :(得分:12)

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

aView.center = CGPointMake(50, 200);

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

答案 3 :(得分:6)

我发现了一个类似的方法(它也使用了一个类别)和gcamp的答案,这对我帮助很大here。在你的情况下就像这样简单:

aView.topLeft = CGPointMake(100, 200);

但是如果您希望例如水平居中并且左侧居住另一个视图,您可以简单地:

aView.topLeft = anotherView.middleLeft;

答案 4 :(得分:6)

在使用Autolayout的情况下,所选答案中的解决方案不起作用。如果您正在使用Autolayout进行观看,请查看此answer

答案 5 :(得分:4)

aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);

答案 6 :(得分:4)

此后,

CGRectOffset已替换为实例方法offsetBy

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

例如,过去是

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

现在是

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

答案 7 :(得分: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);

为我工作^ _ ^

答案 8 :(得分:2)

如果有人需要轻量级a.out以轻松更改Swift页边距,您可以使用this

UIView

答案 9 :(得分:1)

@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

答案 10 :(得分:0)

以下是Swift 3的回答,因为Swift 3不接受“Make”。

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

答案 11 :(得分:0)

其他方式:

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

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

答案 12 :(得分:0)

迅速

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