繁体   English   中英

以编程方式约束目标C

[英]Constraints programmatically with Objective C

我不知道我在做什么错:我正在创建一个UIView,它占据了所有屏幕(已经有约束),然后以编程方式创建了一个UI Image View:

_panel = [[UIImageView alloc] initWithImage:[self loadImageForKey:@"registerPanel"]];
_panel.frame = CGRectMake(0, 0, 100, 100);
_panel.exclusiveTouch = YES;
_panel.userInteractionEnabled = YES,
[self.scrollView addSubview:_panel];

问题来了:我在创建的面板上添加了约束,但崩溃了(我在ViewWillAppear上这样做):

NSLayoutConstraint *centreHorizontallyConstraint = [NSLayoutConstraint
                                                    constraintWithItem:_panel
                                                    attribute:NSLayoutAttributeCenterX
                                                    relatedBy:NSLayoutRelationEqual
                                                    toItem:self.view
                                                    attribute:NSLayoutAttributeCenterX
                                                    multiplier:1.0
                                                    constant:0];

NSLayoutConstraint *centreVerticalConstraint = [NSLayoutConstraint
                                                constraintWithItem:_panel
                                                attribute:NSLayoutAttributeCenterX
                                                relatedBy:NSLayoutRelationEqual
                                                toItem:self.view
                                                attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0
                                                constant:0];


[_panel addConstraint:centreHorizontallyConstraint];
[_panel addConstraint:centreVerticalConstraint];

错误消息:添加到视图时,约束的项必须是该视图的后代(或视图本身)。 如果在组装视图层次结构之前需要解决约束,则会崩溃。 中断-[UIView _viewHierarchyUnpreparedForConstraint:]进行调试。

首先,您不能在panel和self.view之间创建约束,因为没有公共父对象,而是要使用scrollview创建它们

NSLayoutConstraint *centreHorizontallyConstraint = [NSLayoutConstraint
                                                    constraintWithItem:_panel
                                                    attribute:NSLayoutAttributeCenterX
                                                    relatedBy:NSLayoutRelationEqual
                                                    toItem:self.scrollView 
                                                    attribute:NSLayoutAttributeCenterX
                                                    multiplier:1.0
                                                    constant:0];

NSLayoutConstraint *centreVerticalConstraint = [NSLayoutConstraint
                                                constraintWithItem:_panel
                                                attribute:NSLayoutAttributeCenterY
                                                relatedBy:NSLayoutRelationEqual
                                                toItem:self.scrollView 
                                                attribute:NSLayoutAttributeCenterY
                                                multiplier:1.0
                                                constant:0];


[_scrollView  addConstraint:centreHorizontallyConstraint];
[_scrollView  addConstraint:centreVerticalConstraint];

另外两个约束的centerX,你也需要宽度和高度,或更好的顶部,领先,落后和底部滚动视图,,,宽度和高度静态或比例self.view

//

另外,对于要以编程方式添加约束的任何视图,都必须设置

[self.scrollView setTranslatesAutoresizingMaskIntoConstraints: NO];
[self.panel setTranslatesAutoresizingMaskIntoConstraints: NO];

可以将scrollView的子视图约束到scrollView的父视图(在这种情况下为self.view),但这可能不是您想要的。

编辑:为澄清起见,收到错误的原因是因为您初始化了约束:

toItem:self.view

然后尝试添加它们:

[_panel addConstraint:centreHorizontallyConstraint];
[_panel addConstraint:centreVerticalConstraint];

您要将它们添加到toItem对象:

[self.view addConstraint:centreHorizontallyConstraint];
[self.view addConstraint:centreVerticalConstraint];

同样,您可能不想在主视图_panel ,但这将编译并运行:

#import "AddPanelScrollViewController.h"   /// just default .h

@interface AddPanelScrollViewController ()

@property (strong, nonatomic) UIScrollView *scrollView;
@property (strong, nonatomic) UIImageView *panel;

@end

@implementation AddPanelScrollViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _scrollView = [UIScrollView new];
    _scrollView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:_scrollView];

    [_scrollView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:20.0].active = YES;
    [_scrollView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-20.0].active = YES;
    [_scrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:20.0].active = YES;
    [_scrollView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-20.0].active = YES;

    _scrollView.backgroundColor = [UIColor blueColor];

    _panel = [UIImageView new];

    // required
    _panel.translatesAutoresizingMaskIntoConstraints = NO;

    [self.scrollView addSubview:_panel];

    // frame will be ignored when using auto-layout / constraints
//  _panel.frame = CGRectMake(0, 0, 100, 100);

    _panel.exclusiveTouch = YES;
    _panel.userInteractionEnabled = YES;
    _panel.backgroundColor = [UIColor redColor];

    // _panel needs width and height constraints
    [_panel.widthAnchor constraintEqualToConstant:100.0].active = YES;
    [_panel.heightAnchor constraintEqualToConstant:100.0].active = YES;

    NSLayoutConstraint *centreHorizontallyConstraint = [NSLayoutConstraint
                                                        constraintWithItem:_panel
                                                        attribute:NSLayoutAttributeCenterX
                                                        relatedBy:NSLayoutRelationEqual
                                                        toItem:self.view
                                                        attribute:NSLayoutAttributeCenterX
                                                        multiplier:1.0
                                                        constant:0];

    NSLayoutConstraint *centreVerticalConstraint = [NSLayoutConstraint
                                                    constraintWithItem:_panel
                                                    attribute:NSLayoutAttributeCenterY
                                                    relatedBy:NSLayoutRelationEqual
                                                    toItem:self.view
                                                    attribute:NSLayoutAttributeCenterY
                                                    multiplier:1.0
                                                    constant:0];

    // if constraints are releated to "self.view" that's where they need to be added
    [self.view addConstraint:centreHorizontallyConstraint];
    [self.view addConstraint:centreVerticalConstraint];

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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