iphone - por - itunes
¿Una manera simple de cambiar la posición de UIView? (12)
@TomSwift Swift 3 respuesta
aView.center = CGPoint(x: 150, y: 150); // set center
O
aView.frame = CGRect(x: 100, y: 200, width: aView.frame.size.width, height: aView.frame.size.height ); // set new position exactly
O
aView.frame = aView.frame.offsetBy(dx: CGFloat(10), dy: CGFloat(10)) // offset by an amount
Cambio la posición de una UIView con los siguientes códigos sin cambiar el tamaño de la vista.
CGRect f = aView.frame;
f.origin.x = 100; // new x
f.origin.y = 200; // new y
aView.frame = f;
¿Hay una manera más simple de cambiar solo la posición de vista?
Aquí está la respuesta de Swift 3 para cualquiera que busque, ya que Swift 3 no acepta "Hacer".
aView.center = CGPoint(x: 200, Y: 200)
En mi trabajo no usamos macros. Entonces la solución proporcionada por @TomSwift me inspiró. Veo la implementación de CGRectMake y creo el mismo CGRectSetPos pero sin macros.
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;
}
Para usar, solo pongo marco, X e Y
viewcontroller.view.frame = CGRectSetPos(viewcontroller.view.frame, 100, 100);
Trabaja para mí ^ _ ^
Encontré un enfoque similar (también usa una categoría) con la respuesta de gcamp que me ayudó mucho here . En tu caso es tan simple como esto:
aView.topLeft = CGPointMake(100, 200);
pero si quiere, por ejemplo, centrar horizontalmente y hacia la izquierda con otra vista, puede simplemente:
aView.topLeft = anotherView.middleLeft;
La solución en la respuesta seleccionada no funciona en caso de utilizar Autolayout. Si está utilizando el diseño automático para las vistas, eche un vistazo a esta answer .
Otra manera:
CGPoint position = CGPointMake(100,30);
[self setFrame:(CGRect){
.origin = position,
.size = self.frame.size
}];
Esto ahorro parámetros de tamaño y cambio de origen solamente.
Si alguien necesita una extensión ligera de Swift
para cambiar los márgenes de UIView
fácilmente, puede usar github.com/katleta3000/UIView-Frame
view.top = 16
view.right = self.width
view.bottom = self.height
self.height = view.bottom
UIView también tiene una propiedad en el center
. Si solo desea mover la posición en lugar de cambiar el tamaño, simplemente puede cambiar eso, por ejemplo:
aView.center = CGPointMake(50, 200);
De lo contrario, lo harías de la forma en que publicaste.
Yo tuve el mismo problema. Hice una categoría simple de UIView que corrige eso.
.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
.metro
#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
CGRectOffset
ha sido reemplazado desde entonces por el método de instancia offsetBy
.
https://developer.apple.com/reference/coregraphics/cgrect/1454841-offsetby
Por ejemplo, lo que solía ser
aView.frame = CGRectOffset(aView.frame, 10, 10)
ahora sería
aView.frame = aView.offsetBy(dx: CGFloat(10), dy: CGFloat(10))
aView.center = CGPointMake(150, 150); // set center
o
aView.frame = CGRectMake( 100, 200, aView.frame.size.width, aView.frame.size.height ); // set new position exactly
o
aView.frame = CGRectOffset( aView.frame, 10, 10 ); // offset by an amount
Editar:
No compilé esto todavía, pero debería funcionar:
#define CGRectSetPos( r, x, y ) CGRectMake( x, y, r.size.width, r.size.height )
aView.frame = CGRectSetPos( aView.frame, 100, 200 );
aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);