Jak wyśrodkować podgląd UIView
Mam UIView
wewnątrz UIView
m i chcę, aby wewnętrzna UIView
była zawsze wyśrodkowana wewnątrz zewnętrznej, bez konieczności zmiany rozmiaru szerokości i wysokości.
Ustawiłem rozpórki i sprężyny tak, aby były na górze/lewo/prawo / na dole bez ustawiania zmiany rozmiaru. Ale nadal się nie Wyśrodkowuje. Jakiś pomysł?
12 answers
Objective-C
yourSubView.center = CGPointMake(yourView.frame.size.width / 2,
yourView.frame.size.height / 2);
Swift
yourSubView.center = CGPoint(x: yourView.frame.size.width / 2,
y: yourView.frame.size.height / 2)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-06 03:26:08
Możesz to zrobić i zawsze będzie działać:
child.center = [parent convertPoint:parent.center fromView:parent.superview];
I dla Swift:
child.center = parent.convert(parent.center, from:parent.superview)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-28 15:36:55
Zanim zaczniemy, przypomnijmy, że punkt początkowy jest lewym górnym rogu CGPoint
widoku.
Ważne, aby zrozumieć poglądy i rodziców.
Spójrzmy na ten prosty kod, kontroler 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()
}
}
To utworzy ten widok: początek i środek czarnego prostokąta pasują do tych samych współrzędnych co jego rodzic
Teraz spróbujmy dodać subView kolejny subview i dać subview to samo pochodzenie co subView, ale sprawia, że subview jest 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)
I oto wynik:
Z powodu tej linii:
subSubView.frame.origin = subView.frame.origin;
Spodziewasz się, że pochodzenie fioletowego prostokąta będzie takie samo, jak jego rodzic (czarny prostokąt), ale idzie pod nim, i dlaczego tak jest? Ponieważ po dodaniu widoku do innego widoku ramka subView "świat" jest teraz prostokątem nadrzędnym, jeśli masz widok, który to początek na głównym ekranie jest w coords (15,15) dla wszystkich jego sub widoki, lewy górny róg będzie (0,0)
Dlatego zawsze musisz odwoływać się do rodzica przez jego związany prostokąt, który jest "światem" jego podwidań, pozwala naprawić tę linię do:
subSubView.frame.origin = subView.bounds.origin;
I zobacz magię, podsubview znajduje się teraz dokładnie w jego rodzicu:
Więc, podoba ci się " ok, chciałem tylko skupić mój pogląd na moich rodziców pogląd, co w tym wielkiego?" cóż, to to nic wielkiego, wystarczy "przetłumaczyć" punkt centrum rodzica, który jest pobierany z jego ramki do centrum granic rodzica robiąc to:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Mówisz mu "weź centrum widzenia rodziców i przekształć je w świat subSubView".
I otrzymasz taki wynik:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 16:54:37
Użyłbym:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
CGRectGetMidY(self.parentView.bounds));
Lubię korzystać z opcji CGRect
...
SWIFT 3:
self.childView.center = CGPoint(x: self.parentView.bounds.midX,
y: self.parentView.bounds.midY);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 21:16:51
1. Jeśli masz włączony autolayout:
- Wskazówka: aby wyśrodkować widok na inny widok z autolayout, możesz użyć tego samego kodu dla dowolnych dwóch widoków udostępniających co najmniej jeden widok nadrzędny.
Po pierwsze wyłączanie autoezyzacji widoków potomnych
UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
-
Jeśli jesteś UIView+Autolayout lub Purelayout :
[view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2]; [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
-
Jeśli używasz tylko metod autolayout poziomu 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 autolayout:
I preferuję:
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);
})];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-21 14:01:19
Najprostszy sposób:
child.center = parent.center
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 16:37:24
Ustaw tę maskę automatyzującą w widoku wewnętrznym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 11:43:46
Z IOS9 można korzystać z interfejsu API kotwicy układu.
Kod wyglądałby tak:
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true
Przewaga tego nad CGPointMake
lub CGRect
jest taka, że za pomocą tych metod ustawiasz środek widoku na stałą, ale za pomocą tej techniki ustawiasz związek między dwoma poglądami, które będą trwać wiecznie, bez względu na to, jak parentview
się zmieni.
Tylko upewnij się, zanim zrobisz to zrobić:
self.view.addSubview(parentView)
self.view.addSubView(chidview)
I ustawić translatesAutoresizingMaskIntoConstraints
dla każdego widoku na false.
To zapobiegnie awarii i ingerencji AutoLayout.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 01:17:56
Używanie tego samego środka w widoku i podview jest najprostszym sposobem na to. Możesz zrobić coś takiego,
UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-17 22:38:21
Inne rozwiązanie z PureLayout za pomocą autoCenterInSuperview
.
// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
[outerview addSubview:innerView];
[innerView autoCenterInSuperview];
Tak to wygląda:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 17:01:44
Możesz użyć
yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))
I W Swift 3.0
yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 08:52:03
Użyłbym:
child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
To proste, krótkie i słodkie. Jeśli użyjesz powyższej odpowiedzi @Hejazi i parent.center
jest ustawione na coś innego niż (0,0)
Twój subview nie będzie wyśrodkowany!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 23:34:30