如何在iOS中绘制单点线

2024-04-13

我想知道绘制单点线的最佳方法是什么? 我的目标是在 tableViewCell 中绘制这条线,使其看起来就像本机单元格分隔符。 我不想使用原生分隔符,因为我想使用不同的颜色和不同的位置(不是底部......)。

起初我使用 1px UIView 并将其着色为灰色。但在 Retina 显示屏中,它看起来像 2px。 也尝试使用此方法:

- (void)drawLine:(CGPoint)startPoint endPoint:(CGPoint)endPoint inColor:(UIColor *)color {

    CGMutablePathRef straightLinePath = CGPathCreateMutable();
    CGPathMoveToPoint(straightLinePath, NULL, startPoint.x, startPoint.y);
    CGPathAddLineToPoint(straightLinePath, NULL, endPoint.x, endPoint.y);

    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = straightLinePath;
    UIColor *fillColor = color;
    shapeLayer.fillColor = fillColor.CGColor;
    UIColor *strokeColor = color;
    shapeLayer.strokeColor = strokeColor.CGColor;
    shapeLayer.lineWidth = 0.5f;
    shapeLayer.fillRule = kCAFillRuleNonZero;
    [self.layer addSublayer:shapeLayer];
}

由于某种原因,它在 60% 的情况下都能正常工作。是不是出了什么问题? 不管怎样,我很高兴听到更好的方法。

Thanks.


我也做了同样的事UIView类别。这是我的方法:

#define SEPARATOR_HEIGHT 0.5

- (void)addSeparatorLinesWithColor:(UIColor *)color
{
    [self addSeparatorLinesWithColor:color edgeInset:UIEdgeInsetsZero];
}


- (void)addSeparatorLinesWithColor:(UIColor *)color edgeInset:(UIEdgeInsets)edgeInset
{

    UIView *topSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(edgeInset.left, - SEPARATOR_HEIGHT, self.frame.size.width - edgeInset.left - edgeInset.right, SEPARATOR_HEIGHT)];
    [topSeparatorView setBackgroundColor:color];
    [self addSubview:topSeparatorView];

    UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(edgeInset.left, self.frame.size.height + SEPARATOR_HEIGHT, self.frame.size.width - edgeInset.left - edgeInset.right, SEPARATOR_HEIGHT)];
    [separatorView setBackgroundColor:color];
    [self addSubview:separatorView];
}

只是为了补充雷米的精彩答案,这样做可能更简单。制作一个类 UILine.m

@interface UILine:UIView
@end
@implementation UILine
-(id)awakeFromNib
    {
    // careful, contentScaleFactor does NOT WORK in storyboard during initWithCoder.
    // example, float sortaPixel = 1.0/self.contentScaleFactor ... does not work.
    // instead, use mainScreen scale which works perfectly:
    float sortaPixel = 1.0/[UIScreen mainScreen].scale;
    UIView *topSeparatorView = [[UIView alloc] initWithFrame:
        CGRectMake(0, 0, self.frame.size.width, sortaPixel)];

    topSeparatorView.userInteractionEnabled = NO;
    [topSeparatorView setBackgroundColor:self.backgroundColor];
    [self addSubview:topSeparatorView];

    self.backgroundColor = [UIColor clearColor];
    self.userInteractionEnabled = NO;
    }
@end

在 IB 中,放入 UIView,单击 Identity Inspector 并将该类重命名为 UILine。设置width你想在IB。将高度设置为 1 或 2 像素 - 只是这样您就可以在 IB 中看到它。设置背景色你想在IB。当您运行该应用程序时,它将变成一条 1 像素的线、该宽度、该颜色。 (您可能不应该受到 Storyboard/xib 中任何默认自动调整大小设置的影响,我无法让它中断。)您已经完成了。

注意:你可能会想“为什么不直接调整 UIView 的大小在 awakeFromNib 的代码中?”在故事板应用程序中加载时调整视图大小是有问题的 - 请参阅此处有关它的许多问题!

有趣的问题:您可能只是将 UIView 在故事板上设置为 10 或 20 像素高,这样您就可以看到它。当然,它会在应用程序中消失,您会得到漂亮的一根像素线。但!一定要记住self.userInteractionEnabled = NO,或者它可能会超越您的其他按钮!


2016解决方案!https://stackoverflow.com/a/34766567/294884 https://stackoverflow.com/a/34766567/294884

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在iOS中绘制单点线 的相关文章

随机推荐

  • discord.py send_message 用法

    我已经开始致力于一个项目来加速我对 python 的学习 我正在尝试重新创建一个我经常使用的不和谐机器人 因为我已经习惯了它的功能 下面是我当前的代码 import discord from discord import User from
  • 使用 Visual Studio 在线构建定义构建 SSIS 解决方案....dtproj 不受 MSBuild 支持,无法构建

    我通过 Visual Studio Online 创建了一个构建定义 用于构建 SSIS 项目 dtproj 构建似乎成功 但出现一条警告 指出 MSBuild 不支持 dtproj 无法构建 SSDT已安装在构建服务器上 有谁知道为什么会
  • Flask-后退按钮即使在注销后也会返回到会话

    我正在使用 Flask 创建一个需要登录和注销的网站 我正在使用 Flask Security 来帮助解决这个问题 我的问题是 注销后 如果点击后退按钮 我将返回到用户页面 有没有办法防止在退出后按 Flask 中的后退按钮返回会话 您可以
  • 通过Java运行cmd命令

    我发现了几个通过 Java 类运行 cmd 命令的代码片段 但我无法理解它 这是打开cmd的代码 public void excCommand String new dir Runtime rt Runtime getRuntime try
  • 当飞行模式打开时 CLLocationManager 如何获取位置

    我的应用程序使用 CLLocationManager 从设备获取位置更新 我曾假设当设备处于飞行模式时 我不会获得位置更新 但是我愿意 我之所以这么认为 是因为 Apple 表示飞行模式会关闭 Wifi 蜂窝网络 蓝牙和 GPS 看 htt
  • response.authResponse 为 null

    我编写了以下代码来检查 facebook 的登录状态 FB getLoginStatus function response if response status connected var user id response authRes
  • 为什么 XmlNodeList 是一次性的?

    我找不到这个问题的答案 只是出于好奇 为什么XmlNodeList 类 http msdn microsoft com en us library system xml xmlnodelist 28v vs 110 29 aspx在 NET
  • 如何使用 MsDeploy 设置 iisApp Provider 的部署路径?

    我正在为我的 Web 应用程序创建 Web 部署包 zip 文件 我发现我可以通过在打包站点期间包含 pubxml 并在构建期间使用 PublishProfile 属性来指定该配置文件来指定应用程序的站点名称 pubxml 有
  • 在 Vala 中使用 Glib.Settings 时如何处理错误?

    我在 Vala 应用程序中使用 Glib Settings 我想确保即使架构或密钥不可用 我的程序也能正常工作 所以我添加了一个 try catch 块 但是如果我使用不存在的密钥 程序就会出现段错误 据我了解 它甚至没有到达 catch
  • 层次结构中具有可选元素的 XPath

    正如在这个堆栈溢出答案 https stackoverflow com questions 4608097 xpath to select a table row that has a cell containing specified t
  • TSQL 选择一行或多行进行连接

    这是类似于以下的问题 TSQL 按 2 个条件之一选择行 https stackoverflow com questions 10208849 tsql select rows by one from 2 conditions 但结果与我想
  • Java:如何创建 HTTP 浏览会话

    我正在尝试创建一个向服务器发送一些 POST 请求的 Java 应用程序 第一个请求是带有身份验证信息的请求 然后 当我发送下一个请求时 我得到的答案是我的会话已过期 但我在同一秒内发送下一个请求 所以它不能超时 所以我猜想 Java 中有
  • Twitter PHP API 应用程序访问直接消息权限?

    I have set my application permissions as read Write Direct Messages as shown in the figure 我已经保存了这些设置 But when i authent
  • 如何下载并安装 lint?

    有谁知道如何获取 Mac Windows 和 Linux 的 lint sudo port install lint找不到它 我只见过 BSD 的 lint 有splint http www splint org 但是 GPL lint 重
  • 如何列出Excel中三列中值的所有可能组合?

    我有三列 每一列都有不同类型的主数据 如下所示 现在 我想要这三个单元格的所有可能组合 就像 aa kk jj aa kk ff aa ll jj aa ll ff aa mm jj 这可以用公式来完成吗 我发现一个公式有 2 列 但我无法
  • Prism的RegionManager视图切换性能

    我正在对使用 PRISM 库编写的 WPF 应用程序进行性能分析 在此应用程序中 从一个视图导航到另一视图特别慢 尤其是在远离 重 视图时 注意 来回导航时视图会被缓存并且不会重新构造 PRISM 将所有视图保留在 SingleActive
  • 为什么要有移动语义?

    首先我要说的是 我已经阅读了有关移动语义的许多问题中的一些 这个问题不是关于如何使用移动语义 而是问它的目的是什么 如果我没有记错的话 我不明白为什么需要移动语义 背景 我正在实现一个重磅课程 就这个问题而言 它看起来像这样 class B
  • WooCommerce 购物车基于数量的折扣

    在 WooCommerce 中 如何根据购物车中的商品总数设置购物车折扣 例如 1 至 4 件商品 无折扣 5 至 10 件 5 11 至 15 件 10 16 至 20 件商品 15 21 至 25 件商品 20 26 至 30 件商品
  • 使用 Cassandra PasswordAuthenticator 时,DSE OpsCenter 最佳实践失败

    启用 Cassandra 的 PasswordAuthenticator 时 以下最佳实践检查将失败 搜索启用了错误自动提交的节点 启用查询结果缓存的搜索节点 搜索过滤器缓存错误的节点 我的数值符合推荐值 我已经确认 当我在 Cassand
  • 如何在iOS中绘制单点线

    我想知道绘制单点线的最佳方法是什么 我的目标是在 tableViewCell 中绘制这条线 使其看起来就像本机单元格分隔符 我不想使用原生分隔符 因为我想使用不同的颜色和不同的位置 不是底部 起初我使用 1px UIView 并将其着色为灰