wake-up-neo.com

Einfache Möglichkeit, die Position von UIView zu ändern?

Ich ändere die Position eines UIView mit folgenden Codes, ohne die Größe der Ansicht zu ändern.

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

Gibt es eine einfachere Möglichkeit, nur die Ansichtsposition zu ändern?

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

oder

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

oder

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

Bearbeiten:

Ich habe das noch nicht kompiliert, aber es sollte funktionieren:

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

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

Ich hatte das gleiche Problem. Ich habe eine einfache UIView-Kategorie erstellt, die das korrigiert.

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

UIViews haben auch eine center -Eigenschaft. Wenn Sie nur die Position verschieben möchten, anstatt die Größe zu ändern, können Sie dies einfach ändern:

aView.center = CGPointMake(50, 200);

Andernfalls würden Sie es so machen, wie Sie es gepostet haben.

12
lxt

Ich fand eine ähnliche Herangehensweise (es verwendet auch eine Kategorie) mit der Antwort von gcamp, die mir sehr geholfen hat hier . In Ihrem Fall ist das so einfach:

aView.topLeft = CGPointMake(100, 200);

wenn Sie jedoch zum Beispiel horizontal und nach links mit einer anderen Ansicht zentrieren möchten, können Sie einfach:

aView.topLeft = anotherView.middleLeft;
6
Meda

Die Lösung in der ausgewählten Antwort funktioniert nicht, wenn Autolayout verwendet wird. Wenn Sie Autolayout für Ansichten verwenden, schauen Sie sich diese Antwort an.

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

CGRectOffset wurde seitdem durch die Instanzmethode offsetBy ersetzt. 

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

Zum Beispiel, was früher war

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

wäre jetzt

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

In meiner Arbeit verwenden wir keine Makros. Also die von @TomSwift inspirierte Lösung hat mich inspiriert. Ich sehe die Implementierung für CGRectMake und erstelle dasselbe CGRectSetPos, jedoch ohne Makros.

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;
}

Zur Verwendung setze ich nur Frame, X und Y ein

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

Arbeit für mich ^ _ ^

2
gzfrancisco

Wenn jemand eine leichte Swift-Erweiterung benötigt, um UIView-Ränder einfach zu ändern, können Sie this verwenden.

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

@TomSwift Swift 3 Antwort

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

Oder

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

Oder

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

Andere Weise:

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

Dies speichere ich Größenparameter und ändere nur Origin.

0
Bimawa

Hier ist die Antwort von Swift 3 für alle, die suchen, da Swift 3 "Make" nicht akzeptiert.

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