【问题标题】:how to set vertical space constraint in Auto layout with baseline?如何在带基线的自动布局中设置垂直空间约束?
【发布时间】:2013-10-25 13:59:09
【问题描述】:

视图中有两个标签。我的设计师会为我提供以下射手

但是,我只能像下面这样在 Xcode 中设置约束

我的意思是,设计师需要我将两个标签与基线对齐,但是,我可以用框架设置两个标签的空间。有没有办法使用 Autolayout 设置两个标签的空间与基线而不是标签的框架?

【问题讨论】:

    标签: ios ios7 autolayout xcode5


    【解决方案1】:

    感谢@Arkadiusz、@Fogmeister,我已经实现了一个NSLayoutConstraint 类别来做到这一点。

    @implementation NSLayoutConstraint (MarkmanSpace)
    - (void)updateSpaceBetweenTopView:(UIView *)topView bottomView:(UIView *)bottomView {
        UIFont *topViewFont = [self fontFromView:topView];
        UIFont *bottomViewFont = [self fontFromView:bottomView];
        if(topViewFont && bottomViewFont) {
            CGFloat padding = fabs(topViewFont.descender) + fabs([self lowercaseGlyphTopBaselineHeightForFont:bottomViewFont]);
            self.constant -= padding;
        }
    
    }
    
    - (UIFont *)fontFromView:(UIView *)view {
        UIFont *viewFont = nil;
        if([view isKindOfClass:[UILabel class]]) {
            viewFont = ((UILabel *)view).font;
        }
        return viewFont;
    }
    
    - (CGFloat)lowercaseGlyphTopBaselineHeightForFont:(UIFont *)font {
        return font.ascender - font.xHeight;
    }
    
    @end
    

    但是有一个问题,就是font.xHeight低于汉字的实际高度,

    【讨论】:

      【解决方案2】:

      您的设计师希望您使用基线和 x 高度,请参阅 http://en.wikipedia.org/wiki/Baseline_(typography)。自动布局中没有 x-height 的格式选项(请参阅NSLayoutFormatOptions),所以我认为不可能。

      【讨论】:

      • 我还没有研究过,但我认为有一种方法可以从 UIFont 获取 x 高度。然后使用 x 高度作为添加约束的度量(在代码中)。当然,它不适用于更改字体大小,但您可以更新常量或其他东西......
      • @Fogmeister:没错。您可以在两个标签的基线之间设置垂直间距约束,并将其constant 设置为 x 高度。我打算编辑我​​的答案,但你的评论更快:)。
      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2014-03-24
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2016-07-11
      相关资源
      最近更新 更多