2014-12-02 19 views
9

Ich schrieb ein Programm in swift und gerade jetzt bemerkte ich, dass ich direkten Zugriff auf CGRect Frame Breite und Höhe Eigenschaften direkt ohne die CGSize Breite und Höhe. Das heißt, ich kann jetzt einen Code wie diesen schreiben.Unterschied zwischen frame.size.width und frame.width

@IBOutlet var myView: UIView! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    var height = myView.frame.height 
    var height1 = myView.frame.size.height 
} 

In Objective-C, wenn ich den gleichen Code zu schreiben versucht, die Linie height = view.frame.height wird einen Fehler werfen. Kann mir jemand bitte den Unterschied (falls vorhanden) in diesen beiden Codezeilen mitteilen.

Antwort

20

Ich schaute nur in die CGRect Strukturreferenz. In Swift ist eine Erweiterung definiert, die Mitglieder height und width haben. Bitte werfen Sie einen Blick auf den Code unten

struct CGRect { 
var origin: CGPoint 
var size: CGSize 
} 

extension CGRect { 
    ... 
    var width: CGFloat { get } 
    var height: CGFloat { get } 
    ... 
} 

Damit Sie direkt height und width Werte aus einer CGRect holen können. Wie Sie diese nur getters sind sehen können, so erhalten Sie eine Fehlermeldung erhalten, wenn Sie versuchen, diese Werte zu setzen mit view.frame.height = someValue

+0

Danke für die Informationen. Können Sie mir einen Link dazu geben, wo ich diese Referenz finde? Ich überprüfte die Dokumentation, konnte diese Erweiterung aber nirgendwo sehen:/ –

+0

Halten Sie die 'Befehl'-Taste gedrückt und bewegen Sie die' Class/Variable' und klicken Sie darauf. –

1

frame von CGRect Struktur ist, abgesehen von seiner width und height nur getters haben, können sie nur sein positiv. Aus der Dokumentation:

Unabhängig davon, ob die Höhe in der CGRect-Datenstruktur als positive oder negative Zahl gespeichert ist, gibt diese Funktion die Höhe zurück, als wäre das Rechteck standardisiert. Das heißt, das Ergebnis ist niemals eine negative Zahl.

jedoch size ist von CGSize Struktur, aus der Dokumentation:

A CGSize Struktur wird manchmal verwendet, um vertreten einen Abstandsvektor, eher als eine physikalische Größe. Als Vektor können seine Werte negativ sein. Um eine CGRect-Struktur zu normalisieren, so dass ihre Größe durch positive Werte dargestellt wird, rufen Sie die standardisierte-Funktion auf.

So ist der Unterschied offensichtlich.

1

In Objective C, als ich versuchte, den gleichen Code zu schreiben, wirft die Zeile height = view.frame.height einen Fehler. Kann mir jemand bitte den Unterschied (falls vorhanden) in diesen beiden Codezeilen mitteilen.

CGGeometry.h definiert einige Typen, darunter die C struct CGRect. Diese Struktur hat zwei Mitglieder: Ursprung und Größe.

Das ist alles, was Sie in C (und Objective-C) mit Punktnotation zugreifen können. Weder C noch Objective-C bieten Erweiterungen für Strukturen.

Swift importiert den Typ als Swift-Struktur. Der Unterschied ist, dass Swift Erweiterungen für Strukturen ermöglicht.So macht es mehrere freie C-Funktionen als Erweiterungen:

CGRectGetMinX() — CGRect.minX 
CGRectGetMidX() — CGRect.midX 
CGRectGetMaxX() — CGRect.maxX 
CGRectGetWidth() — CGRect.width 
[... same for y] 

Diese C-Funktionen gibt es seit Alters-sie in einer staubigen Ecke von Core Graphics leben nur.

Sie sind sehr nützlich, aber Sie müssen ihre Semantik kennen (die ein wenig von den Standard-Accessoren unterscheiden): Sie normalisieren die Dimensionen.

Das bedeutet, dass sie ein Rect mit negativer Breite oder Höhe in ein Rect konvertieren, das den gleichen Bereich mit positiver Größe und Offset-Ursprung abdeckt.

let rect = CGRect(x: 0, y: 0, width: 10, height: -10) 
assert(rect.width == rect.size.width) // OK 
assert(rect.height == rect.size.height) // boom