改变 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 位置的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章