Een subweergave van UIView centreren

Ik heb een UIViewin een UIViewm en ik wil dat de binnenste UIViewaltijd gecentreerd is in de buitenste, zonder dat om de breedte en hoogte te wijzigen.

Ik heb de stutten en veren zo ingesteld dat het boven/links/rechts/onder is zonder de grootte in te stellen. Maar het centreert nog steeds niet. Enig idee?


Antwoord 1, autoriteit 100%

U kunt dit doen en het zal altijd werken:

child.center = [parent convertPoint:parent.center fromView:parent.superview];

En voor Swift:

child.center = parent.convert(parent.center, from:parent.superview)

Antwoord 2, autoriteit 77%

Doelstelling-C

yourSubView.center = CGPointMake(yourView.frame.size.width  / 2, 
                                 yourView.frame.size.height / 2);

Snel

yourSubView.center = CGPoint(x: yourView.frame.size.width  / 2,
                             y: yourView.frame.size.height / 2)

Antwoord 3, autoriteit 15%

Laten we, voordat we beginnen, eraan herinneren dat het beginpunt de linkerbovenhoek CGPointvan een weergave is.
Een belangrijk ding om te begrijpen over meningen en ouders.

Laten we eens kijken naar deze eenvoudige code, een weergavecontroller die een zwart vierkant aan zijn weergave toevoegt:

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()
    }
}

Hiermee wordt deze weergave gemaakt:
de oorsprong en het midden van de zwarte rechthoek passen op dezelfde coördinaten als de bovenliggende

Laten we nu proberen subView een andere SubSubView toe te voegen en subSubview dezelfde oorsprong te geven als subView, maar subSubView een onderliggende weergave van subView te maken

We voegen deze code toe:

var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)

En dit is het resultaat:

Vanwege deze regel:

subSubView.frame.origin = subView.frame.origin;

Je verwacht dat de oorsprong van de paarse rechthoek hetzelfde is als de bovenliggende rechthoek (de zwarte rechthoek), maar hij gaat eronder, en waarom is dat?
Omdat wanneer u een weergave aan een andere weergave toevoegt, het subView-frame “wereld” nu zijn ouder is GEBONDEN RECHTHOEK, als je een weergave hebt waarvan de oorsprong op het hoofdscherm op coördinaten (15,15) ligt voor al zijn subweergaven, is de linkerbovenhoek is (0,0)

Dit is de reden waarom je altijd naar een ouder moet verwijzen door zijn gebonden rechthoek, wat de “wereld” is van zijn subViews, laten we deze regel aanpassen aan:

subSubView.frame.origin = subView.bounds.origin;

En zie de magie, de subSubview bevindt zich nu precies in zijn bovenliggende oorsprong:

Dus, je houdt van “Ok ik wilde alleen mijn mening door mijn ouders bekijken, wat is de grote deal?”
Nou, het is geen Big Deal, je hoeft alleen maar ‘vertalen’ het ouderpunt-punt dat van zijn frame naar het bounds-centrum van de ouder wordt genomen
Door dit te doen:

subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);

Je vertelt hem eigenlijk “neem ouders kijken naar centrum en converteer het in subsubviewwereld”.

en u krijgt dit resultaat:


Antwoord 4, Autoriteit 9%

Ik zou gebruiken:

self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
                                    CGRectGetMidY(self.parentView.bounds));

Ik hou van gebruik van de CGRectopties …

SWIFT 3:

self.childView.center = CGPoint(x: self.parentView.bounds.midX,
                                        y: self.parentView.bounds.midY);

Antwoord 5, Autoriteit 6%

1. Als u autolayout hebt ingeschakeld:

  • HINT: voor het centreren van een weergave op een ander weergave met autolayout, kunt u dezelfde code gebruiken voor twee weergaven die ten minste één ouderweergave delen.

Allereerst van alle Kinderbeelden uitschakelen Autoresizing

UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
  1. Als u UIView + autolayout of purelayout :

    [view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
    [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
    
  2. Als u alleen Uikit Level Autolayout-methoden gebruikt:

    [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. Zonder autolayout:

Ik geef de voorkeur:

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);
})];

Antwoord 6, Autoriteit 5%

De eenvoudigste manier:

child.center = parent.center

Antwoord 7, Autoriteit 3%

U kunt

gebruiken

yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))

en in Swift 3.0

yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)

Antwoord 8, Autoriteit 3%

Stel dit autoresizing-masker in op uw innerlijke weergave.


Antwoord 9, autoriteit 3%

Met IOS9 kunt u de lay-outanker-API gebruiken.

De code ziet er als volgt uit:

childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true

Het voordeel hiervan ten opzichte van CGPointMakeof CGRectis dat je met die methoden het midden van de weergave op een constante zet, maar met deze techniek stel je een relatie in tussen de twee weergaven die voor altijd zullen blijven bestaan, ongeacht hoe de parentviewverandert.

Wees er zeker van voordat u dit doet:

       self.view.addSubview(parentView)
        self.view.addSubView(chidview)

en om de translatesAutoresizingMaskIntoConstraintsvoor elke weergave in te stellen op false.

Dit voorkomt dat het crasht en dat AutoLayout interfereert.


Antwoord 10, autoriteit 2%

Het gebruik van hetzelfde middelpunt in de weergave en de subweergave is de eenvoudigste manier om dit te doen. Je kunt zoiets als dit doen,

UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];

Antwoord 11

Een andere oplossing met PureLayoutmet behulp van autoCenterInSuperview.

// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
[outerview addSubview:innerView];
[innerView autoCenterInSuperview];

Zo ziet het eruit:


Antwoord 12

In c# of Xamarin.ios kunnen we dit zo gebruiken

imageView.Center = nieuwe CGPoint(tempView.Frame.Size.Width / 2,
tempView.Frame.Size.Height / 2);


Antwoord 13

Dit werkte voor mij

childView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true

Antwoord 14

Ik zou gebruiken:

child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)

Dit is eenvoudig, kort en krachtig. Als u het bovenstaande antwoord van @Hejazi gebruikt en parent.centeris ingesteld op iets anders dan (0,0), wordt uw subweergave niet gecentreerd!


Antwoord 15

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

Other episodes