你能在IB中输入带有小数的约束值吗?

12

希望这只是一个简单的设置问题。

我无法在IB中输入带有小数点的约束值。每当我输入一个带有小数点的值并按回车键时,系统就会四舍五入它!

在代码中创建约束时,我没有这个问题。只会在IB中出现。

有什么办法吗?

5个回答

29

可以做到。

  1. 输入带有"f"后缀的值,如下所示: enter image description here

  2. 点击“优先级”。注意有效约束值的变化为0.5: enter image description here

  3. 按ESC键

在Xcode 7中,将舍入设置为0,看起来最可靠的方法是在代码中进行设置。 - Digitech
1
这在Xcode 7.3.1上经过测试并且可行。请确保您准确地遵循说明,尽管它看起来有些奇怪。 - AmitP
2
在Xcode 8.3中,这对我不起作用。当我按下回车键时,“0.5f”被替换为“,5”,当文本字段失去焦点时,则被替换为0。 - iosdude
它在Xcode 8.3.2上运行,正如@AmitP所说,请确保您遵循说明。 - Stan
1
它在Xcode 9.4.1中工作了,但只有在我将区域更改为“系统偏好设置/语言和地区”中使用点(.)作为小数的国家后才能正常运行。 - Sihad Begovic
显示剩余3条评论

7

我认为这需要通过编程来完成。从Xcode 6.3开始,在故事板编辑器中,约束常量值似乎仅限于整数(而不像乘数值可以是小数点后面的数字)。

对于谷歌搜索者,以下是实现方法:

要在故事板中指定约束的小数值,您可以设置约束iVar的常量属性。以下是将高度约束设置为0.5f的示例:

在您的头文件中:

@property (nonatomic, retain) IBOutlet NSLayoutConstraint *separatorHeightConstraint;

请将IBOutlet连接到storyboard中的约束。
在您的实现中:
-(void)layoutSubviews {
    [super layoutSubviews];
    self.separatorHeightConstraint.constant = 0.5f;
}

这就是全部内容!


每次视图布局其视图(很多次)时,这将更改约束的“常量”。 “常量”应该只设置一次,然后它会在“layoutSubviews”上自动重绘。或者我错过了什么? - Alejandro Iván
设置常量不会触发布局。苹果的文档称:“覆盖viewWillLayoutSubviews或layoutSubviews方法来修改布局引擎返回的结果。” 链接 - adamup
也许我表达错了。我的意思是你应该调用constraint.constant=value; 一次,然后调用[self.view setNeedsLayout];,让布局系统自己完成它的任务。为什么要在每个布局周期都重新设置值呢? - Alejandro Iván
明白了。这个问题是几年前的,但我认为当时在其他地方设置十进制约束(然后调用setNeedsLayout)会导致约束在再次调用layoutSubviews之前被四舍五入为1.0f。最近我没有尝试过这个方法,因为现在可以在Storyboard中设置小于1.0f的分数约束而不会出现任何问题。 - adamup

4
如果您需要在故事板中设置常量小数值,而不依赖于屏幕比例,可以使用“用户定义的运行时属性”,例如对于约束常量,它应该是:
键路径: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
我会这样做:
- (void)updateConstraints {
   self.separatorHeightConstraint.constant = 0.5f;
   [super updateConstraints];
}

-1

在所需的十进制值前加上 0。

例如:0.9,而不是 .9


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接