ビューのサイズを変更せずに、次のコードでUIViewの位置を変更します。
CGRect f = aView.frame;
f.Origin.x = 100; // new x
f.Origin.y = 200; // new y
aView.frame = f;
ビューの位置のみを変更するより簡単な方法はありますか?
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
UIViewにはcenter
プロパティもあります。サイズを変更するのではなく、位置を移動するだけの場合は、それを変更することができます-例:
aView.center = CGPointMake(50, 200);
それ以外の場合は、投稿した方法で実行します。
Gcampの回答で同様のアプローチ(カテゴリも使用)が見つかりました。これは非常に役立ちました here 。あなたの場合はこれと同じくらい簡単です:
aView.topLeft = CGPointMake(100, 200);
しかし、たとえば、水平方向と左に別のビューを中央に配置するには、次のようにします。
aView.topLeft = anotherView.middleLeft;
選択した回答のソリューションは、自動レイアウトを使用している場合は機能しません。ビューに自動レイアウトを使用している場合は、この answer をご覧ください。
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))
aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);
私の仕事では、マクロを使用しません。したがって、@ 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
拡張を必要とする場合- this を使用できます
view.top = 16
view.right = self.width
view.bottom = self.height
self.height = view.bottom
@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
他の方法:
CGPoint position = CGPointMake(100,30);
[self setFrame:(CGRect){
.Origin = position,
.size = self.frame.size
}];
これはサイズパラメータを保存し、Originのみを変更します。
Swift 3は "Make"を受け入れないため、探している人のためのSwift 3の回答を示します。
aView.center = CGPoint(x: 200, Y: 200)