Mam UIView
wewnętrzną UIView
m i chcę, aby wewnętrzna UIView
była zawsze wyśrodkowana wewnątrz zewnętrznej, bez konieczności zmiany rozmiaru i wysokości.
Ustawiłem rozpórki i sprężyny tak, aby znajdowały się na górze / po lewej / prawej / dolnej stronie bez zmiany rozmiaru. Ale nadal nie jest to centrum. Dowolny pomysł?
iphone
objective-c
ios
ipad
xonegirlz
źródło
źródło
Odpowiedzi:
Cel C
yourSubView.center = CGPointMake(yourView.frame.size.width / 2, yourView.frame.size.height / 2);
Szybki
yourSubView.center = CGPoint(x: yourView.frame.size.width / 2, y: yourView.frame.size.height / 2)
źródło
bounds
a nie theframe
, ponieważframe
jest niezdefiniowane, jeśli widok matransform
.size
jest używany.frame
właściwość jest niezdefiniowana, jeśli widok zawiera element,transform
który nie jest transformacją tożsamości; przeczytaj dokumentację dotyczącą właściwości ramy UIView .Możesz to zrobić i zawsze będzie działać:
A dla Swift:
źródło
child.center = parent.center
. Użyłbym `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Spowoduje to zawsze wyśrodkowanie widoku podrzędnego, niezależnie od tego, na co jest ustawione centrum widoku nadrzędnego.UIView.bounds
odnosi się do samego widoku (i dlategobounds.origin
początkowo wynosi zero), podczas gdyUIView.center
jest określony w układzie współrzędnych superviewu .Zanim zaczniemy, przypomnijmy tylko, że punkt początkowy to lewy górny róg
CGPoint
widoku. Ważna rzecz do zrozumienia o poglądach i rodzicach.Przyjrzyjmy się temu prostemu kodowi, kontrolerowi widoku, który dodaje do widoku czarny kwadrat:
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. createDummyView() super.view.backgroundColor = UIColor.cyanColor(); } func createDummyView(){ var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50)); super.view.addSubview(subView); view.backgroundColor = UIColor.blackColor() } }
Stworzy to taki widok: początek i środek czarnego prostokąta pasują do tych samych współrzędnych, co jego rodzic
Teraz spróbujmy dodać subView inny SubSubView i nadając subSubview to samo źródło co subView, ale uczyń subSubView widokiem potomnym subView
Dodamy ten kod:
var subSubView = UIView(); subSubView.frame.origin = subView.frame.origin; subSubView.frame.size = CGSizeMake(20, 20); subSubView.backgroundColor = UIColor.purpleColor() subView.addSubview(subSubView)
A oto wynik:
Z powodu tej linii:
Spodziewasz się, że pochodzenie fioletowego prostokąta będzie takie samo jak jego rodzic (czarny prostokąt), ale znajduje się pod nim, a dlaczego tak jest? Ponieważ kiedy dodajesz widok do innego widoku, „świat” ramki widoku podrzędnego jest teraz jego nadrzędnym PROSTOKĄTEM OGRANICZONYM. w lewym górnym rogu będzie (0,0)
Dlatego zawsze musisz odnosić się do rodzica przez powiązany prostokąt, który jest „światem” jego podwidoków, naprawmy tę linię tak, aby:
I zobacz magię, subSubview znajduje się teraz dokładnie w swoim nadrzędnym źródle:
Więc lubisz "ok, chciałem skupić się tylko na poglądach moich rodziców, o co chodzi?" cóż, to nic wielkiego, wystarczy "przetłumaczyć" nadrzędny punkt środkowy, który jest przenoszony z ramki do środka granic rodzica, wykonując następujące czynności:
Właściwie mówisz mu „weź centrum widoku rodziców i przekształć je w świat subSubView”.
Otrzymasz taki wynik:
źródło
Użyłbym:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds), CGRectGetMidY(self.parentView.bounds));
Lubię korzystać z
CGRect
opcji ...SWIFT 3:
self.childView.center = CGPoint(x: self.parentView.bounds.midX, y: self.parentView.bounds.midY);
źródło
1. Jeśli masz włączone automatyczne układanie:
Przede wszystkim wyłącz autorezację widoków potomnych
UIView *view1, *view2; [childview setTranslatesAutoresizingMaskIntoConstraints:NO];
Jeśli jesteś UIView + Autolayout lub Purelayout :
Jeśli używasz tylko metod autoukładu na poziomie UIKit:
[view1 addConstraints:({ @[ [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f] ]; })];
2. Bez automatycznego układu:
Wolę:
UIView *parentView, *childView; [childView setFrame:({ CGRect frame = childView.frame; frame.origin.x = (parentView.frame.size.width - frame.size.width) / 2.0; frame.origin.y = (parentView.frame.size.height - frame.size.height) / 2.0; CGRectIntegral(frame); })];
źródło
CGRectIntegral
Najłatwiejszy sposób:
źródło
Ustaw tę automatyczną maskę na swój widok wewnętrzny.
źródło
Możesz użyć
yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))
Oraz w Swift 3.0
yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
źródło
W systemie IOS9 można używać interfejsu API zakotwiczenia układu.
Kod wyglądałby tak:
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true
Zaletą tego przejęcia
CGPointMake
lubCGRect
które z tych metod ustawiania środek celu stałą, ale z tej techniki ustawiania relacji między dwoma widokami, które posiadają zawsze, nie ważne jak sięparentview
zmienia.Tylko upewnij się, zanim to zrobisz:
self.view.addSubview(parentView) self.view.addSubView(chidview)
i ustawić
translatesAutoresizingMaskIntoConstraints
dla każdego widoku fałsz.Zapobiegnie to awariom i zakłóceniom funkcji AutoLayout.
źródło
Korzystanie z tego samego środka w widoku i podglądzie jest najprostszym sposobem na zrobienie tego. Możesz zrobić coś takiego,
UIView *innerView = ....; innerView.view.center = self.view.center; [self.view addSubView:innerView];
źródło
Kolejne rozwiązanie z PureLayout korzystającym z
autoCenterInSuperview
.// ... UIView *innerView = [UIView newAutoLayoutView]; innerView.backgroundColor = [UIColor greenColor]; [innerView autoSetDimensionsToSize:CGSizeMake(100, 30)]; [outerview addSubview:innerView]; [innerView autoCenterInSuperview];
Tak to wygląda:
źródło
W C # lub Xamarin.ios możemy używać w ten sposób
imageView.Center = nowy CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
źródło
Użyłbym:
child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
To jest proste, krótkie i słodkie. Jeśli użyjesz odpowiedzi @ Hejazi powyżej i
parent.center
ustawisz cokolwiek innego niż(0,0)
Twój podgląd podrzędny, nie zostanie wyśrodkowany!źródło
func callAlertView() { UIView.animate(withDuration: 0, animations: { let H = self.view.frame.height * 0.4 let W = self.view.frame.width * 0.9 let X = self.view.bounds.midX - (W/2) let Y = self.view.bounds.midY - (H/2) self.alertView.frame = CGRect(x:X, y: Y, width: W, height: H) self.alertView.layer.borderWidth = 1 self.alertView.layer.borderColor = UIColor.red.cgColor self.alertView.layer.cornerRadius = 16 self.alertView.layer.masksToBounds = true self.view.addSubview(self.alertView) }) }// calculation works adjust H and W according to your requirement
źródło