Ios 使用objective-c/core图形的水平居中文本

Ios 使用objective-c/core图形的水平居中文本,ios,objective-c,core-graphics,Ios,Objective C,Core Graphics,我试图用核心图形在iPhone屏幕上居中显示文本,结果发现 但是,我自己尝试这个代码,却无法真正让它工作。文本并没有真正集中在我的屏幕上,我不知道如何编辑代码来解决我的问题 这是我得到的结果: 这看起来基本正确:一些小的观察结果: 我不是指ui屏幕,而是指文本呈现的视图。例如,如果实际上在一些UIView子类实现中,您只需参考self.bounds.size 我将使用属性格式副本不仅获取边界矩形的大小,还用于绘图点。例如,使用drawAtPoint:withAttributes:代替drawAt

我试图用核心图形在iPhone屏幕上居中显示文本,结果发现

但是,我自己尝试这个代码,却无法真正让它工作。文本并没有真正集中在我的屏幕上,我不知道如何编辑代码来解决我的问题

这是我得到的结果:


这看起来基本正确:一些小的观察结果:

  • 我不是指
    ui屏幕
    ,而是指文本呈现的视图。例如,如果实际上在一些
    UIView
    子类实现中,您只需参考
    self.bounds.size

  • 我将使用
    属性
    格式副本不仅获取边界矩形的大小,还用于
    绘图点
    。例如,使用
    drawAtPoint:withAttributes:
    代替
    drawAtPoint:withFont:

  • 字体颜色也应该是
    属性
    字典的一部分

  • 例如:

    CGSize viewSize = self.bounds.size;
    NSString *text = @"text";
    CGFloat minHeight = 40;
    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:22.0], NSForegroundColorAttributeName: [UIColor redColor]};
    CGSize textSize = [text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, minHeight)
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attributes
                                         context:nil].size;
    [text drawAtPoint:CGPointMake((viewSize.width - textSize.width)/2, (viewSize.height - textSize.height)/2) withAttributes:attributes];
    

    如果执行此操作后仍不居中,则需要确认渲染此内容的
    UIView
    frame
    ,并确保它位于您认为应该位于的位置。您可以在调试器中运行应用程序,然后使用视图调试器确认视图的位置。

    其他人已经声明您的代码基本上是正确的,那么为什么它不在您期望的位置显示文本呢

    我的猜测是,你没有在你认为你是和/或对坐标系感到困惑的视图中绘制

    使用当前视图的边界而不是屏幕将使文本在该视图中居中,如果视图本身在屏幕上居中则可以,但如果视图本身不居中则也会显示偏心

    您应该弄清楚实际在哪个视图中绘制和/或读取坐标系

    要在屏幕中心绘制文本,无论视图如何,都可以按照屏幕坐标计算原点,然后将其转换为视图坐标并在那里绘制。例如,如果您的代码位于视图的
    drawRect
    中,则类似于:

    // Save the point in screen coordinates 
    CGPoint onScreenOrigin = CGPointMake((screenWidth - widthIs)/2, (screenHeight - minHeight)/2);
    // Convert from screen to current view's coordinates
    CGPoint inViewOrigin = [self convertPoint:onScreenOrigin fromView:nil];
    // Draw the text
    [text drawAtPoint:inViewOrigin ...];
    
    无论视图的大小和位置如何,这将在屏幕中心绘制文本-当然,前提是视图覆盖了屏幕上需要文本的区域,否则文本将被裁剪到视图中,并且可能不完整或完全不可见


    HTH

    您能用您的解决方案更新上面的代码吗?对不起,我是新来的目标等…:/@Rob当你说你在另一个StackOverflow问题中找到了答案时,请实际链接到该问题(或直接链接答案)。更新@DavidStockingerIn在这个分屏多任务的时代,我认为你永远都不想用屏幕尺寸来判断事情的走向…@Rob-Fair point,OP最好使用故事板的主视图。但无论哪种方式,OP看起来要么不是在他们认为的视图中绘制,要么是在错误的视图坐标系中绘制-这就是为什么他们的文本偏离中心的原因。仅使用视图边界不一定能解决这一问题(例如,如果视图未居中)。我想对细节进行质疑(拆分视图控制器或其他视图控制器包含场景如何),但我绝对同意您的诊断,即这可能是坐标系转换错误。
    // Save the point in screen coordinates 
    CGPoint onScreenOrigin = CGPointMake((screenWidth - widthIs)/2, (screenHeight - minHeight)/2);
    // Convert from screen to current view's coordinates
    CGPoint inViewOrigin = [self convertPoint:onScreenOrigin fromView:nil];
    // Draw the text
    [text drawAtPoint:inViewOrigin ...];