12 ответов:
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 amountEdit:
Я еще не скомпилировал это, но он должен работать:
#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.м
#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, который мне очень помог здесь. В вашем случае все просто:
aView.topLeft = CGPointMake(100, 200);но если вы хотите, например, центрировать горизонтально и влево с другим видом вы можете просто:
aView.topLeft = anotherView.middleLeft;
решение в выбранном ответе не работает в случае использования автозапуска. Если вы используете Autolayout для просмотра, взгляните на это ответ.
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))
в своей работе мы не используем макросы. Поэтому решение, предоставленное @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);работы для меня ^_^
@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
вот ответ Swift 3 для тех, кто ищет, так как Swift 3 не принимает "Make".
aView.center = CGPoint(x: 200, Y: 200)
иначе:
CGPoint position = CGPointMake(100,30); [self setFrame:(CGRect){ .origin = position, .size = self.frame.size }];Это я сохраняю параметры размера и изменить только происхождение.
Comments