简体   繁体   中英

Add constraints for ScrollView from xib

I have UIScrollView with UIView (as ContentView) with UITableView and two UIWebView (see img). I need to place it to ViewController.

How I do it now:

OrderInfoScrollView *newView = [[OrderInfoScrollView alloc] loadObject];
[self.view addSubview:newView];

and init looks like:

- (OrderInfoScrollView *)loadObject {
    OrderInfoScrollView *result = nil;
    NSArray* elements = [[NSBundle mainBundle] loadNibNamed: @"OrderInfoView" owner:self options: nil];
    for (id anObject in elements)
    {
        if ([anObject isKindOfClass:[self class]])
        {
            result = anObject;
            break;
        }
    }

    return result;
}

It works fine, but I can't add constraints for this. I need to equal width to self.view, leading space = 3, top margin = 0 .

I've already tried this:

UIView *superView = self.OrderInfoView;
[superView addSubview:newView];
NSDictionary *views = NSDictionaryOfVariableBindings(superView, newView);
NSArray *equalWidthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[newView]" options:0 metrics:nil views:views];
NSArray *verticalConstraints =[NSLayoutConstraint 
//NSArray *equalWidthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[newView(==superView)]" options:0 metrics:nil views:views];
NSArray *verticalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[newView]" options:0 metrics:nil views:views];
NSArray *horizontalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[newView]" options:0 metrics:nil views:views];

[superView addConstraints:equalWidthConstraints];
[superView addConstraints:horizontalConstraints];
[superView addConstraints:verticalConstraints];

And something like this:

 NSLayoutConstraint *constraint = [NSLayoutConstraint
                                       constraintWithItem:newView
                                       attribute:NSLayoutAttributeWidth
                                       relatedBy:NSLayoutRelationEqual
                                       toItem:self.view
                                       attribute:NSLayoutAttributeWidth
                                       multiplier:1.0f
                                       constant:0.0f];

[self.view addConstraint:constraint4];

Also, I tried to place additional UIView and add my scroll view to this (didn't help). The structure was like this:

-UIView
--UIView
---UIScrollView

I tried to setTranslatesAutoresizingMaskIntoConstraints:NO and new approach, but in this case my UIScrollView doesn't appear at all.

[newView setTranslatesAutoresizingMaskIntoConstraints:YES];
NSLayoutConstraint *width =[NSLayoutConstraint
                            constraintWithItem:newView
                            attribute:NSLayoutAttributeWidth
                            relatedBy:0
                            toItem:self.view
                            attribute:NSLayoutAttributeWidth
                            multiplier:1.0
                            constant:0];
[self.view addConstraint:width];

Any idea? I really need to reuse this UIScrollView .

笔尖与UIScrollView

It was a long way, but I get it. I make separate xib for UIView (aka ContentView ), set constraints to all UIViews , that first is top margin = 0 and the last one margin bottom = 0 . setTranslatesAutoresizingMaskIntoConstraints: NO for ContentView and for all views inside it. Init this in this way:

OrderInfoView *contentView = [[OrderInfoView alloc] loadObject];
[self.orderInfoScrollView addSubview:contentView];

UIView *superView = self.orderInfoScrollView;
OrderInfoView *newView = contentView;
UIView *megaView = self.view;
NSDictionary *views = NSDictionaryOfVariableBindings(superView, newView, megaView);
NSArray *verticalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[newView]|" options:0 metrics:nil views:views];
NSArray *horizontalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[newView]|" options:0 metrics:nil views:views];

[superView addConstraints:horizontalConstraints];
[superView addConstraints:verticalConstraints];

[newView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint *width =[NSLayoutConstraint
                            constraintWithItem:newView
                            attribute:NSLayoutAttributeWidth
                            relatedBy:0
                            toItem:megaView
                            attribute:NSLayoutAttributeWidth
                            multiplier:1.0
                            constant:0];
[megaView addConstraint:width];

Hope it will be useful for someone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM