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?
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 );
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
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
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.
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;
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.
aView.frame = CGRectMake(100, 200, aView.frame.size.width, aView.frame.size.height);
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))
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 ^ _ ^
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
@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
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.
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)