iphone - senza - itools pokemon go




Modo semplice per cambiare la posizione di UIView? (8)

Cambio la posizione di un UIView con i seguenti codici senza modificare la dimensione della vista.

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

C'è un modo più semplice per cambiare solo la posizione della vista?


@TomSwift Swift 3 risposta

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

Altro modo:

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

Ciò salvi i parametri di dimensione e cambi solo l'origine.


Gli UIView hanno anche una proprietà del center . Se vuoi semplicemente spostare la posizione anziché ridimensionarla, puoi semplicemente cambiarla, ad esempio:

aView.center = CGPointMake(50, 200);

Altrimenti lo faresti come hai postato.


Ho avuto lo stesso problema. Ho creato una semplice categoria UIView che risolve il problema.

.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

La soluzione nella risposta selezionata non funziona in caso di utilizzo di Autolayout. Se stai usando l'Autolayout per le viste dai un'occhiata a questa answer .


Nel mio lavoro non usiamo macro. Quindi la soluzione fornita da @TomSwift mi è stata ispirata. Vedo l'implementazione per CGRectMake e creo gli stessi CGRectSetPos ma senza macro.

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

Per usare ho messo solo frame, X e Y

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

Lavora per me ^ _ ^



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

Modificare:

Non l'ho ancora compilato, ma dovrebbe funzionare:

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

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






uiview