如何创建0.5像素的线宽

时间:2014-02-04 12:07:26

标签: ios iphone objective-c uitableview

在iOS 7中,表格视图的分隔线比以前的ios更薄,看起来宽度为0.5像素。

我需要使用类似的分隔线(仅垂直)将单元格拆分为2,并且我希望此行与常规分隔线的宽度相同。

所以我想知道添加这样一条线的最佳方法是什么?

如果我使用UIView并将其宽度设置为0.5它将不可见,如果我将其宽度设置为1.0,我当然会得到1.0px而不是0.5px的线宽。

我尝试使用视网膜大小为1.0px的资源,但效果不佳......

14 个答案:

答案 0 :(得分:24)

您将宽度设置为0.5 - 或使其始终为1像素,然后将其设置为(1.0 / [UIScreen mainScreen].scale)

我以前做过这件事并且工作正常

我认为你无法看到它的原因是你正确地将线条居中放在屏幕中间,这将使得线条的原点(320 - 0.5)/ 2.0,是X原点159.75 - 0.75可能会弄乱 - 或者单元格正在删除视图的背景颜色

答案 1 :(得分:23)

我做了这个步骤:

  1. 创建高度为1px的约束
  2. 将约束与IBOutlet(文件.m)
  3. 连接
  4. 在ViewDidLoad
  5. 中更改约束的常量0.5

    它对我有用。

答案 2 :(得分:14)

假设您使用Storyboard进行单元格布局:

将具有所需高度和1px宽度的UIView放入您的单元格中。给它你想要的任何背景颜色。标准分色器颜色约为。 RGB(200199204)。

然后创建UIView的子类,例如HairlineView并覆盖awakeFromNib()

-(void)awakeFromNib {
    self.layer.borderColor = [self.backgroundColor CGColor];
    self.layer.borderWidth = (1.0 / [UIScreen mainScreen].scale) / 2;

    self.backgroundColor = [UIColor clearColor];
}

您在1px宽视图周围绘制边框,宽度为2 * 0.25px,总计为0.5px,这是您想要达到的宽度,然后通过将背景设置为隐藏背景来隐藏视图背景明确。最后一步很重要,没有它就行不了。

将视图类型设置为HairlineView,然后它应该可以正常工作。

以编程方式执行此操作时,您必须覆盖其他方法,例如initWithFrame()也许,因为只有在从Storyboard布局创建视图时才会调用awakeFromNib()。

答案 3 :(得分:10)

上面的一些答案已经是正确的,但只是更新:Xcode 8中的,现在您可以使用十进制数设置布局约束的常量。不再需要通过用户定义的运行时属性连接IBOutlet或设置常量。

Decimal constant

答案 4 :(得分:5)

您可以使用十进制数设置布局约束的常量,但是UIBuilder在Xcode中有一些错误8,9,10

我的解决方案:

  1. 按源代码enter image description here]
  2. 打开xib文件
  3. 找到您的布局约束常量并更改为0.5 enter image description here

答案 5 :(得分:3)

您可以在故事板height 0.5f中设置约束;它不会直接显示,但它在约束列表中可见,如屏幕截图enter image description here

所示

答案 6 :(得分:2)

您可以使用Core Graphics绘制渐变:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 1.0f)];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
[view.layer insertSublayer:gradient atIndex:0];

答案 7 :(得分:1)

我的解决方案:

  1. 创建视图,在视图中设置约束:“height = 0px”,转到“Identity Inspector”并将此约束的优先级编辑为750.

  2. 然后选择视图并单击“pin”按钮,在此视图中添加另一个约束:“height = 0.5”,优先级为1000.在“Identity Inspector”中,您可以看到第二个约束自动变为“身高> = 0.5“

  3. 适用于Xcode 7.3.1

答案 8 :(得分:0)

您将视图放在底部的单元格中。并将其设置为视图的深色。并将其高度设置为0.5 PX。你可以得到每个单元格的分隔符。根据单元格宽度保持宽度。

答案 9 :(得分:0)

而不是尝试根据分隔符样式设置视图高度。移除分隔符。 将单元格分隔符样式设置为StyleNone 然后在单元格的中间和底部添加两个高度为.5或1像素的视图。现在它看起来都相同并且具有分隔符样式。

答案 10 :(得分:0)

棘手的方式:

  1. 在storyboard或xib中,将唯一值(例如123)设置为线高约束
  2. 使用文本编辑器
  3. 打开storyboard或xib
  4. 用0.5
  5. 替换唯一值(例如123)

答案 11 :(得分:0)

我使用此类绘制1像素线(不是1点,而是1像素)。

class HairlineView: UIView {
    override func awakeFromNib() {
        super.awakeFromNib()

        for constraint in self.constraints {
            if let _ = constraint.firstItem as? HairlineView,
               constraint.firstAttribute == .height,
               constraint.firstAnchor.isKind(of: NSLayoutDimension.self),
               constraint.secondItem == nil,
               constraint.secondAnchor == nil {
                constraint.constant = (1.0 / UIScreen.main.scale)
                return
            }
        }
    }
}

此操作的前提条件是必须附加带有高度限制的UIView。代码将查看视图的现有约束,找到高度约束并将其值设置为 your_desired_height (以像素为单位)(不要与点混淆)。

通过将 your_desired_height 替换为所需的任何值,可以轻松地将

代码更改为任何值。

答案 12 :(得分:0)

我的方法:

public extension UIView {
    
    func thinDivider() {
        for c in constraints {
            if c.constant == 1 {
                c.constant = (1.0 / UIScreen.main.scale)
            }
        }
    }
    
}

明智地使用(仅在分隔线上使用)。

注意:只需将高度限制设置为1,然后从代码中调用view.thinDivider()。这是一种懒惰的解决方案,可以避免将插座出口到您需要的每个高度限制。

旁注:在故事板编辑器中将高度设置为0.5会在构建和视图不可见后重置为0

答案 13 :(得分:-1)

您可以在Xcode 8 / iOS 10中以下列方式解决此问题,而不使用约束:

  1. 使用Interface Builder在故事板中添加UIView。根据需要设置此属性,只是为了直观地显示它在单元格中的外观(即高度= 44,宽度= 1)。此时宽度是否大于你所需的宽度并不重要(即0.5)。

  2. 在视图控制器中为此视图创建一个IBOutlet(即UIView * splitLine)。

  3. 在视图控制器的viewWillAppear:方法中添加以下方法:

  4. [self.splitLine setFrame:CGRectMake(x,y,0.5,44)];

    在此方法中,您可以将分隔线的宽度指定为0.5,将高度指定为所需的任何值。这些值会覆盖故事板中指定的值。