Ich habe ein UIView
Inneres in einem UIView
m und ich möchte, dass das Innere UIView
immer in dem Äußeren zentriert ist, ohne dass es die Breite und Höhe ändern muss.
Ich habe die Streben und Federn so eingestellt, dass sie oben / links / rechts / unten sind, ohne die Größe zu ändern. Aber es zentriert sich immer noch nicht. Irgendeine Idee?
iphone
objective-c
ios
ipad
xonegirlz
quelle
quelle
Antworten:
Ziel c
Schnell
quelle
bounds
und nicht das verwendenframe
, da dasframe
undefiniert ist, wenn die Ansicht eine hattransform
.size
verwendet wird.frame
Eigenschaft ist undefiniert, wenn die Ansicht eine hattransform
, die nicht die Identitätstransformation ist. Lesen Sie die Dokumentation zur Frame-Eigenschaft von UIView .Sie können dies tun und es wird immer funktionieren:
Und für Swift:
quelle
child.center = parent.center
. Ich würde "child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2)" verwenden. Dadurch wird Ihre Unteransicht immer zentriert, unabhängig davon, auf was Ihr übergeordnetes Ansichtszentrum eingestellt ist.UIView.bounds
ist relativ zur Ansicht selbst (und daherbounds.origin
anfänglich Null), währendUIView.center
sie im Koordinatensystem der Übersicht angegeben ist .Bevor wir beginnen, möchten wir Sie nur daran erinnern, dass der Ursprungspunkt die obere linke Ecke
CGPoint
einer Ansicht ist. Eine wichtige Sache, um über Ansichten und Eltern zu verstehen.Schauen wir uns diesen einfachen Code an, einen Ansichts-Controller, der seiner Ansicht ein schwarzes Quadrat hinzufügt:
Dadurch wird diese Ansicht erstellt: Der Ursprung und die Mitte des schwarzen Rechtecks passen zu denselben Koordinaten wie das übergeordnete Element
Versuchen wir nun, subView eine weitere SubSubView hinzuzufügen und subSubview denselben Ursprung wie subView zuzuweisen, machen subSubView jedoch zu einer untergeordneten Ansicht von subView
Wir werden diesen Code hinzufügen:
Und das ist das Ergebnis:
Wegen dieser Zeile:
Sie erwarten, dass der Ursprung des lila Rechtecks mit dem des übergeordneten Rechtecks (dem schwarzen Rechteck) identisch ist, aber er geht darunter, und warum ist das so? Wenn Sie einer anderen Ansicht eine Ansicht hinzufügen, ist der SubView-Frame "world" jetzt das übergeordnete BOUND RECTANGLE. Wenn Sie die Ansicht haben, dass der Ursprung auf dem Hauptbildschirm für alle Unteransichten in Koordinaten (15,15) liegt, ist der obere linke Ecke ist (0,0)
Aus diesem Grund müssen Sie immer auf ein übergeordnetes Element verweisen, indem es ein gebundenes Rechteck bildet, das die "Welt" seiner Unteransichten darstellt. Lassen Sie uns diese Zeile auf Folgendes korrigieren:
Und sehen Sie die Magie, die Unteransicht befindet sich jetzt genau in ihrem übergeordneten Ursprung:
Du magst also "ok, ich wollte meine Sicht nur auf die Sicht meiner Eltern zentrieren, was ist die große Sache?" Nun, es ist keine große Sache, Sie müssen nur den übergeordneten Mittelpunkt "übersetzen", der von seinem Rahmen zum übergeordneten Grenzzentrum genommen wird, indem Sie Folgendes tun:
Sie sagen ihm tatsächlich: "Nehmen Sie das Eltern-Ansichtszentrum und konvertieren Sie es in die subSubView-Welt."
Und Sie erhalten dieses Ergebnis:
quelle
Ich würde ... benutzen:
Ich benutze gerne die
CGRect
Optionen ...SWIFT 3:
quelle
1. Wenn Sie das automatische Layout aktiviert haben:
Deaktivieren Sie zunächst die automatische Größenänderung von untergeordneten Ansichten
Wenn Sie UIView + Autolayout oder Purelayout sind :
Wenn Sie nur Autolayout-Methoden auf UIKit-Ebene verwenden:
2. Ohne Autolayout:
Ich bevorzuge:
quelle
CGRectIntegral
Der einfachste Weg:
quelle
Stellen Sie diese automatische Größenmaske auf Ihre innere Ansicht ein.
quelle
Mit IOS9 können Sie die Layout-Anker-API verwenden.
Der Code würde folgendermaßen aussehen:
Dies hat den Vorteil gegenüber
CGPointMake
oderCGRect
besteht darin, dass Sie mit diesen Methoden den Mittelpunkt der Ansicht auf eine Konstante setzen, mit dieser Technik jedoch eine Beziehung zwischen den beiden Ansichten festlegen, die für immer gültig ist, unabhängig davon, wie sich dieparentview
Änderungen ändern.Stellen Sie einfach sicher, bevor Sie dies tun:
und das
translatesAutoresizingMaskIntoConstraints
für jede Ansicht auf false zu setzen.Dies verhindert Abstürze und AutoLayout-Interferenzen.
quelle
Sie können verwenden
Und in Swift 3.0
quelle
Die Verwendung derselben Mitte in der Ansicht und Unteransicht ist der einfachste Weg, dies zu tun. Sie können so etwas tun,
quelle
Eine andere Lösung mit PureLayout mit
autoCenterInSuperview
.So sieht es aus:
quelle
In c # oder Xamarin.ios können wir dies verwenden
imageView.Center = neuer CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
quelle
Ich würde ... benutzen:
Das ist einfach, kurz und süß. Wenn Sie die Antwort von @ Hejazi oben verwenden und
parent.center
auf etwas anderes als(0,0)
Ihre Unteransicht eingestellt sind, wird sie nicht zentriert!quelle
quelle