Frage

UIView Ihrer Unterklassen und alle die Eigenschaften frame und bounds.Was ist der Unterschied?

War es hilfreich?

Lösung

Grenzen ein UIView ist die Rechteck , ausgedrückt als Ort (x, y) und Größe (Breite, Höhe) relativ zu seinem eigenen Koordinatensystem (0,0).

Der Rahmen eine UIView ist die Rechteck , ausgedrückt als Ort (x, y) und Größe (Breite, Höhe) relativ zu dem Super innerhalb enthalten ist.

Also, stellen Sie sich eine Ansicht, die eine Größe von 100x100 (Breite x Höhe), die bei 25,25 (x, y) seiner Superview hat. Der folgende Code druckt Ansicht dieser Grenzen und Rahmen:

// This method is in the view controller of the superview
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
    NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
    NSLog(@"bounds.size.width: %f", label.bounds.size.width);
    NSLog(@"bounds.size.height: %f", label.bounds.size.height);

    NSLog(@"frame.origin.x: %f", label.frame.origin.x);
    NSLog(@"frame.origin.y: %f", label.frame.origin.y);
    NSLog(@"frame.size.width: %f", label.frame.size.width);
    NSLog(@"frame.size.height: %f", label.frame.size.height);
}

Und die Ausgabe dieses Codes ist:

bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100

frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100

Also, wir, dass in beiden Fällen sehen können, die Breite und die Höhe der Ansicht ist die gleiche, unabhängig davon, ob wir an den Grenzen oder Rahmen suchen. Unterschiedlich ist die x, y Positionierung der Ansicht. Im Fall der Grenzen, sind die x- und y-Koordinaten bei 0,0 als diese Koordinaten in Bezug auf die Ansicht selbst sind. Jedoch sind die Rahmen x und y-Koordinaten in Bezug auf die Position des Sicht innerhalb der übergeordneten Ansicht (die früher gesagt, wir bei 25,25 war).

Es gibt auch eine rel="noreferrer"> die UIViews abdeckt. Siehe Folien 1-20, die nicht nur den Unterschied zwischen Rahmen und Grenzen erklärt, sondern zeigt auch visuelle Beispiele.

Andere Tipps

Kurze Antwort

frame = eine Ansicht, die Lage und die Größe mithilfe der Eltern-Ansicht Koordinatensystem

  • Wichtig für:die Platzierung der anzeigen in den übergeordneten

Grenzen = eine Ansicht die Position und Größe mit sein eigenes Koordinatensystem

  • Wichtig für:die Platzierung der anzeigen, die Inhalte oder Untersichten in sich selbst

Detaillierte Antwort

Zu helfen, mich zu erinnern frame, Ich denke, der ein Bilderrahmen auf einer Wand.Der Bilderrahmen ist wie der Rand einer Ansicht.Ich kann hängen, das Bild irgendwo möchte ich auf die Wand.In der gleichen Weise, ich kann eine Ansicht, wo ich es will innerhalb einer übergeordneten Ansicht (auch als superview).Die übergeordnete Ansicht ist, wie die Wand.Der Ursprung des Koordinatensystems in iOS ist die oben Links.Wir können unseren Blick auf den Ursprung des superview durch die Einstellung der Ansicht frame x-y-Koordinaten (0, 0), die wie hängende unser Bild ganz oben Links in der Ecke der Wand.Bewegen Sie es rechts, erhöhen Sie x, um es zu verschieben nach unten erhöhen y.

Zu helfen, mich zu erinnern Grenzen, Ich denke, der basketball court wo manchmal die basketball-bekommt knocked out of bounds.Sie Dribbeln den ball-alles über den Basketballplatz, aber Sie wissen nicht wirklich, wo das Gericht selbst ist.Es könnte sein, in ein Fitness-Studio, oder draußen an einer high school, oder vor Ihrem Haus.Es spielt keine Rolle.Sie wollen einfach nur, um basketball zu spielen.In der gleichen Weise wird das Koordinatensystem für eine Sicht der Grenzen kümmert sich nur um die anzeigen selbst.Es weiß nichts darüber, wo die Sicht befindet sich in der übergeordneten Ansicht.Die Grenzen', origin (point (0, 0) Standard) ist die Obere linke Ecke der Ansicht.Alle Untersichten, dass diese Ansicht hat sich gelegt, die in Bezug auf diesen Punkt.Es ist wie basketball auf der vorderen linken Ecke des Hofes.

Nun ist die Verwirrung kommt, wenn Sie versuchen zu vergleichen-Rahmen und Grenzen.Es ist eigentlich nicht so schlimm, wie es scheint auf den ersten, aber.Wir wollen nun einige Bilder zu helfen uns zu verstehen.

Frame vs Grenzen

Auf dem ersten Bild auf der linken Seite haben wir eine Ansicht, die sich oben Links der übergeordneten Ansicht. Das gelbe Rechteck stellt die view ' s frame. Auf der rechten Seite sehen wir den Blick wieder, aber dieses mal der übergeordneten Ansicht nicht angezeigt.Das ist, weil die Grenzen nicht wissen, über die Eltern-Ansicht. Das grüne Rechteck stellt die view ' s bounds. Die red dot in beiden Bildern steht die Herkunft der Rahmen oder Grenzen.

Frame
    origin = (0, 0)
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here

Damit der Rahmen und die Grenzen wurden genau in dieses Bild.Schauen wir uns ein Beispiel an, in dem Sie anders sind.

Frame
    origin = (40, 60)  // That is, x=40 and y=60
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here

So können Sie sehen, dass eine änderung der x-y-Koordinaten der Rahmen bewegt es sich in der übergeordneten Ansicht.Aber der Inhalt der Ansicht selbst sieht immer noch genau das gleiche.Die Grenzen haben keine Ahnung, dass irgendetwas anders ist.

Bis jetzt sind die Breite und die Höhe der den Rahmen und die Grenzen wurden genau die gleichen.Das ist nicht immer wahr, aber.Schauen Sie, was passiert, wenn wir drehen Sie die Ansicht um 20 Grad im Uhrzeigersinn.(Die Drehung erfolgt mit Hilfe verwandelt.Siehe die Dokumentation und diese Ansicht und Schicht Beispiele für mehr Informationen.)

Frame
    origin = (20, 52)  // These are just rough estimates.
    width = 118
    height = 187

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here

Sie können sehen, dass die Grenzen sind immer noch die gleichen.Sie wissen immer noch nicht, nichts ist passiert!Die frame-Werte, alle haben sich verändert, aber.

Jetzt ist es ein wenig einfacher, den Unterschied zu sehen zwischen Rahmen und Grenzen, ist es nicht?Der Artikel Sie Wahrscheinlich nicht Verstehen, frames und Grenzen eine Ansicht definiert frame

...die kleinste bounding box Ansicht, dass bezüglich der Eltern koordinieren system, einschließlich alle Transformationen, die angewendet werden, um zu dieser Ansicht zu.

Es ist wichtig zu beachten, dass, wenn Sie verwandeln Sie einen Blick, dann wird der frame wird nicht definiert.Also eigentlich, den gelben Rahmen, die zog ich um das gedrehte grüne Grenzen in die Bild oben, die eigentlich nie existiert.Das heißt, wenn Sie drehen, skalieren oder einige andere transformation dann sollten Sie nicht verwenden die frame-Werte nicht mehr.Weiterhin können Sie die Grenzen der Werte, wenn.Die Apple-docs warnen:

Wichtig: Wenn Sie eine Ansicht transform Eigentum enthält nicht die Einheitsmatrix ist, ist der Rahmen, der dieser Ansicht ist nicht definiert und so sind die Ergebnisse seiner autoresizing-Verhalten.

Ziemlich unglücklich über die autoresizing....Es ist etwas, das Sie tun können, wenn.

Die Apple-docs Zustand:

Beim ändern der transform Eigentum Ihrer Sicht, alle Transformationen im Verhältnis zu der Mitte Punkt der anzeigen.

Also, wenn Sie brauchen, um eine Ansicht verschieben, um in der Eltern nach einer transformation getan wurde, können Sie es durch ändern der view.center Koordinaten.Wie frame, center verwendet das Koordinatensystem des übergeordneten Ansicht.

Ok, let ' s get rid unserer rotation und konzentrieren sich auf die Grenzen.So weit die Grenzen Ursprung immer bei (0, 0).Es muss nicht, aber.Was, wenn unsere Ansicht hat eine große Untersicht, dass ist zu groß, um alle auf einmal?Wir machen es ein UIImageView mit einem großen Bild.Hier ist unser zweites Bild von oben wieder, aber dieses mal können wir sehen, was die gesamten Inhalte unserer Sicht Untersicht Aussehen würde.

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here

Nur die oberen linken Ecke der Bild kann fit in die view ' s bounds.Jetzt schauen Sie, was passiert, wenn wir die änderung der Grenzen', die Ursprungs-Koordinaten.

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (280, 70)
    width = 80
    height = 130

enter image description here

Der Rahmen hat sich nicht bewegt, in der superview aber der Inhalt innerhalb des Rahmens geändert hat, da die Herkunft der Grenzen Rechteck beginnt in einem anderen Teil der Ansicht.Dies ist die ganze Idee hinter einem UIScrollView und es ist Unterklassen (Z. B. ein UITableView).Finden Verständnis UIScrollView für weitere Erläuterungen.

Bei der frame-und Wann Grenzen

Da frame bezieht sich eine Ansicht, die Lage in der übergeordneten Ansicht ist, verwenden Sie es, wenn Sie machen äußere änderungen, wie das ändern der Breite oder finden Sie die Entfernung zwischen der Ansicht und dem oberen Rand des übergeordneten Ansicht.

Verwenden Sie die bounds wenn Sie nach innen änderungen, wie zeichnen von Dingen oder anordnen von Unteransichten in der Ansicht.Verwenden Sie auch die Grenzen, um die Größe der Ansicht, wenn Sie etwas getan transfomierung auf Sie.

Artikel für die weitere Forschung:

Apple docs

Verwandte StackOverflow-Fragen

Andere Ressourcen

Die Praxis selbst

Zusätzlich zum Lesen der oben genannten Artikel, hilft es mir, eine Menge zu machen eine test-app.Möchten Sie vielleicht, um zu versuchen, etwas ähnliches zu tun.(Ich habe die Idee von in diesem video-Kurs aber leider ist es nicht kostenlos.)

enter image description here

Hier ist der code für Ihre Referenz:

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var myView: UIView!

    // Labels
    @IBOutlet weak var frameX: UILabel!
    @IBOutlet weak var frameY: UILabel!
    @IBOutlet weak var frameWidth: UILabel!
    @IBOutlet weak var frameHeight: UILabel!
    @IBOutlet weak var boundsX: UILabel!
    @IBOutlet weak var boundsY: UILabel!
    @IBOutlet weak var boundsWidth: UILabel!
    @IBOutlet weak var boundsHeight: UILabel!
    @IBOutlet weak var centerX: UILabel!
    @IBOutlet weak var centerY: UILabel!
    @IBOutlet weak var rotation: UILabel!

    // Sliders
    @IBOutlet weak var frameXSlider: UISlider!
    @IBOutlet weak var frameYSlider: UISlider!
    @IBOutlet weak var frameWidthSlider: UISlider!
    @IBOutlet weak var frameHeightSlider: UISlider!
    @IBOutlet weak var boundsXSlider: UISlider!
    @IBOutlet weak var boundsYSlider: UISlider!
    @IBOutlet weak var boundsWidthSlider: UISlider!
    @IBOutlet weak var boundsHeightSlider: UISlider!
    @IBOutlet weak var centerXSlider: UISlider!
    @IBOutlet weak var centerYSlider: UISlider!
    @IBOutlet weak var rotationSlider: UISlider!

    // Slider actions
    @IBAction func frameXSliderChanged(sender: AnyObject) {
        myView.frame.origin.x = CGFloat(frameXSlider.value)
        updateLabels()
    }
    @IBAction func frameYSliderChanged(sender: AnyObject) {
        myView.frame.origin.y = CGFloat(frameYSlider.value)
        updateLabels()
    }
    @IBAction func frameWidthSliderChanged(sender: AnyObject) {
        myView.frame.size.width = CGFloat(frameWidthSlider.value)
        updateLabels()
    }
    @IBAction func frameHeightSliderChanged(sender: AnyObject) {
        myView.frame.size.height = CGFloat(frameHeightSlider.value)
        updateLabels()
    }
    @IBAction func boundsXSliderChanged(sender: AnyObject) {
        myView.bounds.origin.x = CGFloat(boundsXSlider.value)
        updateLabels()
    }
    @IBAction func boundsYSliderChanged(sender: AnyObject) {
        myView.bounds.origin.y = CGFloat(boundsYSlider.value)
        updateLabels()
    }
    @IBAction func boundsWidthSliderChanged(sender: AnyObject) {
        myView.bounds.size.width = CGFloat(boundsWidthSlider.value)
        updateLabels()
    }
    @IBAction func boundsHeightSliderChanged(sender: AnyObject) {
        myView.bounds.size.height = CGFloat(boundsHeightSlider.value)
        updateLabels()
    }
    @IBAction func centerXSliderChanged(sender: AnyObject) {
        myView.center.x = CGFloat(centerXSlider.value)
        updateLabels()
    }
    @IBAction func centerYSliderChanged(sender: AnyObject) {
        myView.center.y = CGFloat(centerYSlider.value)
        updateLabels()
    }
    @IBAction func rotationSliderChanged(sender: AnyObject) {
        let rotation = CGAffineTransform(rotationAngle: CGFloat(rotationSlider.value))
        myView.transform = rotation
        updateLabels()
    }

    private func updateLabels() {

        frameX.text = "frame x = \(Int(myView.frame.origin.x))"
        frameY.text = "frame y = \(Int(myView.frame.origin.y))"
        frameWidth.text = "frame width = \(Int(myView.frame.width))"
        frameHeight.text = "frame height = \(Int(myView.frame.height))"
        boundsX.text = "bounds x = \(Int(myView.bounds.origin.x))"
        boundsY.text = "bounds y = \(Int(myView.bounds.origin.y))"
        boundsWidth.text = "bounds width = \(Int(myView.bounds.width))"
        boundsHeight.text = "bounds height = \(Int(myView.bounds.height))"
        centerX.text = "center x = \(Int(myView.center.x))"
        centerY.text = "center y = \(Int(myView.center.y))"
        rotation.text = "rotation = \((rotationSlider.value))"

    }

}

versuchen, den Code unten

laufen
- (void)viewDidLoad {
    [super viewDidLoad];
    UIWindow *w = [[UIApplication sharedApplication] keyWindow];
    UIView *v = [w.subviews objectAtIndex:0];

    NSLog(@"%@", NSStringFromCGRect(v.frame));
    NSLog(@"%@", NSStringFromCGRect(v.bounds));
}

die Ausgabe dieses Codes ist:

Fall Geräteausrichtung ist Portrait

{{0, 0}, {768, 1024}}
{{0, 0}, {768, 1024}}

Fall Geräteausrichtung ist Landschaft

{{0, 0}, {768, 1024}}
{{0, 0}, {1024, 768}}

Natürlich können Sie den Unterschied zwischen Rahmen und Grenzen sehen

Rahmen das Rechteck, das die UIView mit Bezug definiert seine Super .

Grenzen rect ist der Bereich der Werte, die definieren, dass NSView Koordinatensystem.

d. alles in diesem Rechteck wird in der UIView tatsächlich angezeigt werden soll.

Rahmen ist der Ursprung (oben links) und die Größe der Ansicht in seiner Super View Koordinatensystem, das bedeutet, dass Sie die Ansicht in seinem superen Blick übersetzen, indem Sie den Rahmen Ursprung zu ändern, Grenzen auf der anderen Seite ist die Größe und den Ursprung in seinem eigenen Koordinatensystem, so dass standardmäßig die Grenzen Ursprung ist (0,0).

die meiste Zeit der Rahmen und Grenzen kongruent sind, aber wenn man einen Blick auf Rahmen ((140,65), (200250)) und Grenzen ((0,0), (200250)) zum Beispiel und die Ansicht gekippt wurde, so dass es auf seiner rechten unteren Ecke steht, dann werden die Grenzen nach wie vor sein ((0,0), (200250)), aber der Rahmen ist es nicht.

eingeben Bild Beschreibung hier

wird der Rahmen mit dem kleinsten Rechteck sein, das / die Ansicht umgibt einkapselt, so dass der Rahmen (wie im Foto) wird ((140,65), (320.320)).

Ein weiterer Unterschied ist zum Beispiel, wenn Sie einen superview der Grenzen ist haben ((0,0), (200200)) und diese superview hat ein Subview dessen Rahmen ((20,20), (100100)), und Sie geändert der Super Grenzen ((20,20), (200,200)), dann wird der Rahmen noch SubView sein ((20,20), (100,100)), aber durch offseted (20,20), weil seine Superkoordinatensystem wurde durch offseted (20,20).

Ich hoffe, das hilft jemand.

Rahmen seines im Verhältnis zu seiner Super während Bounds im Verhältnis zu seiner NSView.

. Beispiel: X = 40, Y = 60.Also enthält 3 views.This Diagramm zeigt Ihnen klare Vorstellung

FRAME

GRENZEN

Die Antworten oben erklärt haben sehr gut den Unterschied zwischen Bounds und Frames.

  

Bounds: Ein Blick Größe und Lage gemäß seinem eigenen Koordinatensystem

.      

Rahmen. Ein Blick Größe und Lage in Bezug auf seine Superview

Dann gibt es Verwirrung, dass die X bei Bounds, Y immer „0“ sein wird. Das ist nicht wahr . Dies kann in UIScrollView und UICollectionView auch verstanden werden.

Wenn Grenzen x, y nicht 0 ist.
Nehmen wir an, wir eine UIScrollView haben. Wir haben Paginierung umgesetzt. Die UIScrollView hat drei Seiten und seine Contentbreite ist dreimal Bildschirmbreite (nehmen Screen ist 320). Die Höhe ist konstant (unter der Annahme 200).

scrollView.contentSize = CGSize(x:320*3, y : 200)

In drei UIImageViews als Subviews und halten einen genauen Blick auf die x Wert des Rahmens

let imageView0 = UIImageView.init(frame: CGRect(x:0, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
let imageView1 :  UIImageView.init( frame: CGRect(x:320, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
let imageView2 :  UIImageView.init(frame: CGRect(x:640, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
scrollView.addSubview(imageView0)
scrollView.addSubview(imageView0)
scrollView.addSubview(imageView0)
  1. Seite 0: Wenn die Scroll bei 0 Seite ist, wird der Bounds sein (x: 0, y: 0, Breite: 320, Höhe: 200)

  2. Seite 1: Blättern Sie und bewegen zu Seite 1
    Jetzt werden die Grenzen sein (x: 320, y: 0, Breite: 320, Höhe: 200) Denken Sie daran, die wir in Bezug auf sein eigenes Koordinatensystem. So, jetzt die „Visible Teil“ unserer Scroll hat seine „x“ bei 320. Blick auf den Rahmen von imageView1.

  3. Seite 2: Blättern Sie und bewegen zu Seite 2 Bounds: (x: 640, y: 0, Breite: 320, Höhe: 200) nimmt wieder einen Blick auf Rahmen von imageView2

Das Gleiche gilt für den Fall von UICollectionView. Der einfachste Weg, um Collection zu suchen ist es und drucken blättern / log seine Grenzen und Sie bekommen die Idee.

Alle Antworten oben sind richtig, und das ist mein nehmen auf diese:

zwischen Rahmen und Grenzen KONZEPTE Entwicklern Zur Unterscheidung soll lauten:

  
      
  1. relativ zu dem Super (ein Elternteil Ansicht) innerhalb = Rahmen enthalten ist
  2.   
  3. relativ zu seinem eigenen Koordinatensystem, bestimmt seine subview location = BOUNDS
  4.   

„Grenzen“ ist verwirrend, weil es den Eindruck erweckt, dass die Koordinaten der Position der Ansicht sind, für die sie eingestellt ist. Aber diese sind in Beziehungen und in Übereinstimmung mit dem Rahmen Konstanten.

Rahmen eine Ansicht des = Lage und Größe unter Verwendung des Koordinatensystems des Elternansicht

Grenzen = eine Ansicht, die Lage und die Größe seiner eigenen Koordinatensystem mit

Eine Ansicht verfolgt seine Größe und Lage mit Hilfe von zwei Rechtecken: ein Rahmen und ein Rechteck Grenze Rechteck. Der Rahmen Rechteck definiert die Position der Ansicht und Größe in der Super des Koordinatensystem des Super verwenden. Die Grenzen Rechteck definiert das Innenkoordinatensystem, das verwendet wird, wenn der Inhalt der Ansicht zeichnen, einschließlich dem Ursprung und Skalierung. Abbildung 2-1 zeigt die Beziehung zwischen dem Rahmen Rechteck, auf der linken Seite, und die Grenzen Rechteck, auf der rechten Seite.“

Kurz gesagt, der Rahmen ist Super Idee einer Ansicht, und die Grenzen sind die eigene Idee der Ansicht. mehrere Koordinatensysteme aufweist, eine für jede Ansicht, ist ein Teil der Ansichtshierarchie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top