ios - 使用 Objective C 以编程方式进行约束

标签 ios objective-c autolayout constraints

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

_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];

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

最佳答案

可以将 scrollView 的 subview 限制到 scrollView 的父 View (在本例中为 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];

}

关于ios - 使用 Objective C 以编程方式进行约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989666/

相关文章:

iphone - 越狱 iPhone 上的蓝牙编程

ios - Apple Watch 应用程序无法提交无效的 Info.plist 和图标

ios - Xcode UIView rotation : How to set the new position coordinates to 0, 0 旋转后不移动图像?

用于绘制 View 边缘的 Xcode 编译器标志

javascript - 检测移动到 Mobile Safari 中的新选项卡

ios - heightForRowAtIndexPath 从未被称为 iOS9

ios - 拖动图像以适合正确的边界框

ios - Google Analytics 不显示某些页面的跟踪

ios - Xcode 6 在更新 iPhone 6/6+ 时显示 iPhone 5 分辨率?

ios - 自动布局黄色警告。它会使我的应用程序在运行时崩溃吗