【问题标题】:Can you enter a constraint value with decimal in IB?可以在 IB 中输入带小数的约束值吗?
【发布时间】:2015-02-14 12:24:53
【问题描述】:

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

我无法在 IB 中输入带小数的约束值。每当我输入带小数的值并按回车键时,系统都会对其进行四舍五入!

在代码中创建约束时我没有这个问题。仅在 IB 中。

有办法吗?

【问题讨论】:

    标签: storyboard interface-builder autolayout nslayoutconstraint


    【解决方案1】:

    是的,你可以。

    1. 输入带有“f”后缀的值,如下所示:

    2. 单击优先级。注意有效约束值如何变为 0.5:

    3. 按ESC

    【讨论】:

    • 在 Xcode 7 中舍入为 0,看起来最可靠的方法是在代码中设置它
    • 这是在 Xcode 7.3.1 上测试和工作的。确保您准确地按照说明进行操作,尽管看起来很奇怪。
    • 这很奇怪,但它也适用于 Xcode 版本 8.3.1 (8E1000a)
    • 这在 Xcode 8.3 中对我不起作用。当我按下回车键时,“0.5f”被替换为“,5”,当文本字段失去焦点时,“0.5f”被替换为 0。
    • 它有效(Xcode 9.4.1),但只有在我将区域更改为系统偏好设置/语言和区域中使用点 (.) 表示小数的国家之后。
    【解决方案2】:

    如果您需要在故事板中设置不依赖于屏幕比例的常量十进制值,您可以使用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);
    }
    

    【讨论】:

      【解决方案3】:

      键入所需的十进制值并以 0 开头。

      例如0.9,不是 .9

      【讨论】:

        【解决方案4】:

        我会这样做:

        - (void)updateConstraints {
           self.separatorHeightConstraint.constant = 0.5f;
           [super updateConstraints];
        }
        

        【讨论】:

          【解决方案5】:

          我相信它必须以编程方式完成。从 Xcode 6.3 开始,约束常量值在情节提要编辑器中似乎被限制为整数(与可以是小数的乘数值不同)。

          对于 Google 员工,方法如下:

          要为情节提要中定义的约束指定十进制值,您可以设置约束 iVar 的常量属性。下面是一个将高度约束设置为 0.5f 的示例:

          在您的标题中:

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

          然后将 IBOutlet 连接到情节提要中的约束。

          在您的实施中:

          -(void)layoutSubviews {
              [super layoutSubviews];
              self.separatorHeightConstraint.constant = 0.5f;
          }
          

          就是这样!

          【讨论】:

          • 这会在每次视图布局其视图(很多次)时更改约束的constantconstant 应该只设置一次,然后它会在layoutSubviews 上自动重绘。还是我错过了什么?
          • 设置常量不会触发布局。苹果的文档说:“重写 viewWillLayoutSubviews 或 layoutSubviews 方法来修改布局引擎返回的结果。” link
          • 也许我表达错了。我的意思是你应该调用constraint.constant=value; 一次 然后调用[self.view setNeedsLayout]; 让布局系统做它的事情。为什么要在每个布局周期重新设置值?
          • 明白了。这个问题来自几年前,但我认为当时在其他地方设置小数约束(然后调用setNeedsLayout)导致约束在再次调用layoutSubviews 之前的某个时间被舍入到1.0f。我最近没有尝试过,因为这些天可以在情节提要中设置小于 1.0f 的分数约束而没有任何问题。
          猜你喜欢
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 2010-11-26
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多