web-dev-qa-db-fra.com

Un moyen simple de changer la position d’UIView?

Je change la position d'un UIView avec les codes suivants sans changer la taille de la vue.

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

Existe-t-il un moyen plus simple de ne modifier que la position d'affichage?

68
Seunghoon
aView.center = CGPointMake(150, 150); // set center

ou

aView.frame = CGRectMake( 100, 200, aView.frame.size.width, aView.frame.size.height ); // set new position exactly

ou

aView.frame = CGRectOffset( aView.frame, 10, 10 ); // offset by an amount

Modifier:

Je ne l'ai pas encore compilé, mais ça devrait marcher:

#define CGRectSetPos( r, x, y ) CGRectMake( x, y, r.size.width, r.size.height )

aView.frame = CGRectSetPos( aView.frame, 100, 200 );
220
TomSwift

J'ai eu le même problème. J'ai créé une catégorie UIView simple qui corrige cela.

.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
32
gcamp

UIView possède également une propriété center. Si vous voulez juste déplacer la position plutôt que de redimensionner, vous pouvez simplement changer cela - par exemple:

aView.center = CGPointMake(50, 200);

Sinon, vous le feriez comme vous l'avez posté.

12
lxt

J'ai trouvé une approche similaire (elle utilise également une catégorie) avec la réponse de gcamp qui m'a beaucoup aidé ici . Dans votre cas, c'est aussi simple que cela:

aView.topLeft = CGPointMake(100, 200);

mais si vous voulez par exemple centrer horizontalement et à gauche avec une autre vue, vous pouvez simplement:

aView.topLeft = anotherView.middleLeft;
6
Meda

La solution dans la réponse sélectionnée ne fonctionne pas en cas d'utilisation d'Autolayout. Si vous utilisez Autolayout pour les vues, jetez un coup d’œil à ceci answer .

5
Sahil
aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);
4
Mark Adams

CGRectOffset a depuis été remplacé par la méthode d'instance offsetBy

https://developer.Apple.com/reference/coregraphics/cgrect/1454841-offsetby

Par exemple, ce qui était autrefois

aView.frame = CGRectOffset(aView.frame, 10, 10)

serait maintenant

aView.frame = aView.offsetBy(dx: CGFloat(10), dy: CGFloat(10))
3
Roope

Dans mon travail, nous n'utilisons pas de macros. La solution fournie par @TomSwift m'a donc inspiré. Je vois l'implémentation de CGRectMake et crée le même CGRectSetPos mais sans 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;
}

Pour utiliser je ne mets que cadre, X et Y

viewcontroller.view.frame = CGRectSetPos(viewcontroller.view.frame, 100, 100);

Travaille pour moi ^ _ ^

2
gzfrancisco

Si quelqu'un a besoin d'une extension Swift légère pour changer les marges UIView facilement, vous pouvez utiliser this

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

@TomSwift Swift 3 réponse

aView.center = CGPoint(x: 150, y: 150); // set center

Ou

aView.frame = CGRect(x: 100, y: 200, width: aView.frame.size.width, height: aView.frame.size.height ); // set new position exactly

Ou

aView.frame = aView.frame.offsetBy(dx: CGFloat(10), dy: CGFloat(10)) // offset by an amount
1
Ayman Ibrahim

Autre moyen:

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

Cela enregistre les paramètres de taille et ne modifie que l'origine.

0
Bimawa

Voici la réponse de Swift 3 pour ceux qui cherchent, puisque Swift 3 n'accepte pas "Make".

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