UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”

Posted

技术标签:

【中文标题】UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”【英文标题】:UISlider Constraints Programmatically: "Constraint items must each be an instance of UIView or subclass" 【发布时间】:2015-03-06 17:52:23 【问题描述】:

我的约束导致我的应用程序崩溃,因为它们不是 UIView 的实例。但是,至少据我所知,它们 UIView 的实例。我的目标是将此滑块作为 UIBarbuttonItem 附加到工具栏。这是我在 viewDidLoad 中的内容:

// Slider Implementation
slider_textSize.minimumValue = 9;
slider_textSize.maximumValue = 72;
slider_textSize.value = 12;
slider_textSize.continuous = YES;

[self.view setUserInteractionEnabled:YES];
[self.view addSubview:self.slider_textSize];

self.slider_textSize.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addConstraint:[NSLayoutConstraint
                          constraintWithItem:self.slider_textSize
                          attribute:NSLayoutAttributeLeft
                          relatedBy:NSLayoutRelationEqual
                          toItem:self.view
                          attribute:NSLayoutAttributeLeft
                          multiplier:1
                          constant:5]];

[self.view addConstraint:[NSLayoutConstraint
                          constraintWithItem:self.slider_textSize
                          attribute:NSLayoutAttributeRight
                          relatedBy:NSLayoutRelationEqual
                          toItem:button_done attribute:NSLayoutAttributeRight
                          multiplier:1
                          constant:10]];

“slider_textSize”是这个类的一个强大的非原子属性,并在我的初始化程序中实现,如下所示:

[slider_textSize addTarget:self
                 action:@selector(slider_textSizeValueChanged:)
                 forControlEvents:UIControlEventValueChanged];

我一直在使用来自this 问题的答案,但它似乎对我不起作用。这是我得到的错误:

2015-03-06 10:26:08.300 rED[14238:3168995] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Constraint items must each be an instance of UIView or subclass'

我已经尝试了所有我能做的事情,但没有运气。有任何想法吗? 提前致谢!

【问题讨论】:

什么是button_done?你确定是UIButton 假设button_doneUIBarButtonItemUIBarButtonItem 不是 UIView 的子类。 button_done 是一个 UIBarButtonItem,它也在我的标题中声明。对此感到抱歉。 @dan 啊好吧,这更有意义。我尝试将它添加为 UIView 的子视图,就像我为滑块所做的那样,但它抛出了一个异常,有什么想法让它与约束一起工作吗? 您是否尝试将滑块添加到工具栏?如果是这样,您应该使用 [[UIBarButtonItem alloc] initWithCustomView:slider_textSize] 从滑块创建一个条形按钮项,并将其添加为工具栏上的项。 【参考方案1】:

我最终放弃了约束,因为它们对条形按钮项目变得过于复杂。相反,我使滑块的宽度与屏幕宽度成比例。

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;

    CGFloat sliderWidth = .786 * screenWidth;
    CGRect frame = CGRectMake(0, 0, sliderWidth, 32);
    slider_textSize = [[UISlider alloc] initWithFrame:frame];

【讨论】:

但是你真的知道错误的原因吗?

以上是关于UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加约束会破坏自动布局约束

点击以编程方式创建的 UISlider

以编程方式滑动 UISlider

如何以编程方式更改 UISlider 拇指图像的大小

以编程方式在 UITableViewCells 中嵌入多个 UISlider 和 UILabel 控件

在 Swift 中使用 UISlider 以编程方式更改 UILabel