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_done
是UIBarButtonItem
,UIBarButtonItem
不是 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 或子类的实例”的主要内容,如果未能解决你的问题,请参考以下文章