2011-12-09 13 views
29

Quando lo bounds.origin di un UIView non è (0, 0)?Quando sarebbe bound.origin di un UIView non essere (0, 0)?

This post stato utile per me:

IMPORTANTE !! I limiti X e Y, l'origine, servono per spostarsi all'interno della vista . Per eample X + 5, spostando 5pix alla sinistra di origine significato della cornice disegnare tutti i contenuti all'interno di questa vista a sinistra la 5pix di origine del telaio. Non fa nulla per se stesso, è ciò che viene attirato su di esso che ne risente.

Ma descrive solo il caso quando ho impostato il valore di bounds.origin me stesso.
In quali altri casi il valore di bounds.origin != (0, 0)?

+1

Google ha nascosto quel post per qualche inspiegabile ragione - non siamo più permesso di accedervi (vengo portato in una pagina di login, un redirect forzata da Google.com) – Adam

risposta

0

(a cura di nuovo perché non posso cancellare la mia risposta originale dopo che è stata accettata-credito per questo va a Ian, che ha pubblicato una risposta più approfondita sotto :)

Nella maggior parte dei casi questo non accadrà. Se si inizializza la vista con una larghezza e/o un'altezza negativa, si otterrà un'origine con una X negativa della larghezza e/o una Y negativa dell'altezza.

+2

Non credo che questo sia vero . Ho visto casi in cui qualcosa nel sistema correlato all'autorizzazzione sembrava lasciarmi un limite in cui l'origine non era 0.0. Nel mio codice personale non ho mai, mai messo dei limiti così da averlo improvvisamente presentato un numero diverso da zero è stato uno shock. –

+0

@KendallHelmstetterGelner Concordato. Questo è successo a me quando ho avuto un controller di navigazione facendo un po 'ridimensionamento del mio UIScrollView (penso come risultato dell'impostazione "Adjust Scroll View Insets"). – eremzeit

15

Il bounds.origin sarà negativo se si inizializza una vista con negativo larghezza/altezza. Per esempio, se avete fatto

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)]; 

il telaio sarebbe:

origin = { 
    x = -5, 
    y = -15 
}, 
size = { 
    width = 10, 
    height = 20 
} 

limiti:

origin = { 
    x = -10, 
    y = -20 
}, 
size = { 
    width = 10, 
    height = 20 
} 

centro:

x = 0, 
y = -5 

provare per credere!

+0

Questo non ha senso. È uguale all'espressione "Origine del sistema di coordinate relativo a se stesso non uguale a <0,0>" che è falso e non ha senso. – folex

+1

Perché dovresti voler creare una larghezza e un'altezza negative? – Boon

+2

Ha senso o no, quelli sono i risultati che ottieni se esegui questo codice. –

21

Una di bounds.origin UIScrollView non sarà (0, 0) quando il suo contentOffset non è (0, 0). telaio

19

di vista determina la sua posizione nel superview. I limiti della vista determinano le sue posizioni di subviews. Ciò significa che, se cambi i limiti della vista, la sua posizione non verrà modificata, ma verrà modificata la sua posizione di sottoview.

larghezza e l'altezza positivo è come si disegna una vista da in alto a sinistra in basso a destra, mentre il valore negativo è da basso a destra per in alto a sinistra. Così

frame1 = CGRectMake(100, 100, -50, -50) 

è totalmente identico

frame2 = CGRectMake(50, 50, 50, 50). 

E in effetti, se si init una vista con frame1, sarà modificate automaticamente a frame2.

Ma la bounds.origin dei punti di vista non sono identici.Bounds.origin indica il punto in cui "si disegna" la vista, quindi tutti i fotogrammi di sottoview avranno origine a questo punto.

Ad esempio, nel Paesaggio iPhone 6, abbiamo:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)]; 
leftView.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:leftView]; 

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)]; 
rightView.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:rightView]; 

E abbiamo ottenuto:

enter image description here

Troveremo quel lasso di rightView passa automaticamente a valore positivo, che è (342, 50, 275, 275), ma è il suo bounts.origin = (-275,-275).

e si aggiungono subviews:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
leftSubview.backgroundColor = [UIColor grayColor]; 
[leftView addSubview:leftSubview]; 
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
rightSubview.backgroundColor = [UIColor grayColor]; 
[rightView addSubview:rightSubview]; 

enter image description here

Quindi i limiti rende visualizzazione secondaria di rightView segue l'origine, che abbiamo init rightView.

Se cambiamo i limiti di rightView è uguale a leftView: rightView.bounds = leftView.bounds; Quindi la posizione delle due sottoview è la stessa, abbiamo perso le informazioni che la larghezza e l'altezza di rightView sono negative.

enter image description here

E cambiamo i limiti della leftView invece di rightView: CGRect Bounds = leftView.bounds; bounds.origin = CGPointMake (50, 50); leftView.bounds = bounds;

enter image description here

Possiamo vedere, frame.origin del suo visualizzazione secondaria è compensato da bounds.origin (utilizzando meno, non più).

Per concludere:

  1. view.bounds determina tutte le posizione del suo visualizzazione secondaria (compensato da bounds.origin), mentre bounds non influirà la propria posizione nella sua superview.

  2. Se si avvia una vista con larghezza e altezza negative, verrà automaticamente modificato in positivo (che non cambierà la posizione), ma il suo bounds.origin indica il punto in cui si inizia a "disegnare" la vista.

+0

Ottima risposta. "bounds" è confuso perché dà l'impressione che x, y sia la posizione della vista per cui è impostata. Perché hanno legato le dimensioni di una vista alla sua origine locale? –

+0

Bella risposta, grazie per aver dedicato del tempo extra per spiegare le cose insieme a rappresentazioni pittoriche. +1. –

Problemi correlati