【发布时间】:2015-02-14 12:24:53
【问题描述】:
希望这是一个简单的设置。
我无法在 IB 中输入带小数的约束值。每当我输入带小数的值并按回车键时,系统都会对其进行四舍五入!
在代码中创建约束时我没有这个问题。仅在 IB 中。
有办法吗?
【问题讨论】:
标签: storyboard interface-builder autolayout nslayoutconstraint
希望这是一个简单的设置。
我无法在 IB 中输入带小数的约束值。每当我输入带小数的值并按回车键时,系统都会对其进行四舍五入!
在代码中创建约束时我没有这个问题。仅在 IB 中。
有办法吗?
【问题讨论】:
标签: storyboard interface-builder autolayout nslayoutconstraint
【讨论】:
如果您需要在故事板中设置不依赖于屏幕比例的常量十进制值,您可以使用user defined runtime attributes,例如对于约束常量,它将是:
密钥路径:constant
类型:Number
值:0,5
如果你想通过在@2x 和@3x 设备上创建一个宽度为 1 像素的视图来创建分隔符,你可以使用一个约束来设置视图的宽度/高度,并将其类设置为你自己的约束子类。此类子类的示例: OnePixelWidthConstraint.h:
#import <UIKit/UIKit.h>
@interface OnePixelWidthConstraint : NSLayoutConstraint
@end
OnePixelWidthConstraint.m:
#import "OnePixelWidthConstraint.h"
@implementation OnePixelWidthConstraint
- (CGFloat)constant {
return 1./[UIScreen mainScreen].scale;
}
@end
只计算一次:
- (CGFloat)constant {
static CGFloat onePixel = 0;
return onePixel?:(onePixel = 1./[UIScreen mainScreen].scale);
}
【讨论】:
键入所需的十进制值并以 0 开头。
例如0.9,不是 .9
【讨论】:
我会这样做:
- (void)updateConstraints {
self.separatorHeightConstraint.constant = 0.5f;
[super updateConstraints];
}
【讨论】:
我相信它必须以编程方式完成。从 Xcode 6.3 开始,约束常量值在情节提要编辑器中似乎被限制为整数(与可以是小数的乘数值不同)。
对于 Google 员工,方法如下:
要为情节提要中定义的约束指定十进制值,您可以设置约束 iVar 的常量属性。下面是一个将高度约束设置为 0.5f 的示例:
在您的标题中:
@property (nonatomic, retain) IBOutlet NSLayoutConstraint *separatorHeightConstraint;
然后将 IBOutlet 连接到情节提要中的约束。
在您的实施中:
-(void)layoutSubviews {
[super layoutSubviews];
self.separatorHeightConstraint.constant = 0.5f;
}
就是这样!
【讨论】:
constant。 constant 应该只设置一次,然后它会在layoutSubviews 上自动重绘。还是我错过了什么?
constraint.constant=value; 一次 然后调用[self.view setNeedsLayout]; 让布局系统做它的事情。为什么要在每个布局周期重新设置值?
setNeedsLayout)导致约束在再次调用layoutSubviews 之前的某个时间被舍入到1.0f。我最近没有尝试过,因为这些天可以在情节提要中设置小于 1.0f 的分数约束而没有任何问题。