改变 UIView 位置的简单方法?

Posted

技术标签:

【中文标题】改变 UIView 位置的简单方法?【英文标题】:Simple way to change the position of UIView? 【发布时间】:2011-07-06 20:59:57 【问题描述】:

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

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

有没有更简单的方法只改变视图位置?

【问题讨论】:

注意:如果您使用的是 AutoLayouts,则它不起作用。 【参考方案1】:
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 );

【讨论】:

是的,我也为 CGRectOffset 点赞。它减少了胡言乱语。胡言乱语,我现在可以花点别的钱了。 对于 Swift 3:aView.frame = aView.frame.offsetBy(dx: 100, dy: 100) 有没有办法为这个过渡设置动画 - 它看起来很刺耳。【参考方案2】:

我遇到了同样的问题。我制作了一个简单的 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 实用又聪明! 如果您在Swift 中需要类似的内容 - 请随时使用github.com/katleta3000/UIView-Frame【参考方案3】:

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

aView.center = CGPointMake(50, 200);

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

【讨论】:

【参考方案4】:

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

aView.topLeft = CGPointMake(100, 200);

但是,如果您想使用另一个视图以水平居中和向左居中,您可以简单地:

aView.topLeft = anotherView.middleLeft;

【讨论】:

【参考方案5】:

在使用自动布局的情况下,所选答案中的解决方案不起作用。如果您使用 Autolayout 来查看视图,请查看 answer。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:
aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);

【讨论】:

我认为我们在同一时间输入了相同的内容。 我喜欢尝试首先获得最佳答案的快感。【参考方案8】:

在我的工作中,我们不使用宏。所以@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 的原始实现,他们(Apple)就是这样做的。所以我跟着他们。【参考方案9】:

如果有人需要轻 Swift 扩展来轻松更改 UIView 边距 - 您可以使用 this

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

【讨论】:

【参考方案10】:

@TomSwift 斯威夫特 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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

其他方式:

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

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

【讨论】:

【参考方案13】:

迅速

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

【讨论】:

以上是关于改变 UIView 位置的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

UIView 绝对屏幕点

如何在 ViewController 中调用所有自定义 UIView 的方法?

ios之UIview动画

在两个 UIView 之间应用混合模式的最简单/最快的方法

iOS UIView 动画浅谈

如何获得旋转的 UIView 的正确框架(包括正确的位置)