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ł?

Author: Eitan T, 2012-06-29

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)
 161
Author: happy pig,
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)
 248
Author: Hejazi,
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

Tutaj wpisz opis obrazka

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:

Tutaj wpisz opis obrazka

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:

Tutaj wpisz opis obrazka

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:

Tutaj wpisz opis obrazka

 26
Author: Daniel Krom,
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);
 22
Author: theprojectabot,
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];
  1. Jeśli jesteś UIView+Autolayout lub Purelayout :

    [view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
    [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
    
  2. 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);
})];
 20
Author: Cemal Eker,
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
 9
Author: juancazalla,
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

Tutaj wpisz opis obrazka

Ustaw tę maskę automatyzującą w widoku wewnętrznym.

 7
Author: Mayank Jain,
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.

 6
Author: Roymunson,
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];
 4
Author: codeFood,
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:

Centrum z PureLayout

 4
Author: High6,
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)
 4
Author: Sayali Shinde,
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!
 1
Author: Old Name,
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