在iOS 7中,表格视图的分隔线比以前的ios更薄,看起来宽度为0.5像素。
我需要使用类似的分隔线(仅垂直)将单元格拆分为2,并且我希望此行与常规分隔线的宽度相同。
所以我想知道添加这样一条线的最佳方法是什么?
如果我使用UIView
并将其宽度设置为0.5它将不可见,如果我将其宽度设置为1.0,我当然会得到1.0px而不是0.5px的线宽。
我尝试使用视网膜大小为1.0px的资源,但效果不佳......
答案 0 :(得分:24)
您将宽度设置为0.5 - 或使其始终为1像素,然后将其设置为(1.0 / [UIScreen mainScreen].scale)
我以前做过这件事并且工作正常
我认为你无法看到它的原因是你正确地将线条居中放在屏幕中间,这将使得线条的原点(320 - 0.5)/ 2.0,是X原点159.75 - 0.75可能会弄乱 - 或者单元格正在删除视图的背景颜色
答案 1 :(得分:23)
我做了这个步骤:
它对我有用。
答案 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)
答案 4 :(得分:5)
您可以使用十进制数设置布局约束的常量,但是UIBuilder在Xcode中有一些错误8,9,10
我的解决方案:
答案 5 :(得分:3)
您可以在故事板height 0.5f
中设置约束;它不会直接显示,但它在约束列表中可见,如屏幕截图
答案 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)
我的解决方案:
创建视图,在视图中设置约束:“height = 0px”,转到“Identity Inspector”并将此约束的优先级编辑为750.
然后选择视图并单击“pin”按钮,在此视图中添加另一个约束:“height = 0.5”,优先级为1000.在“Identity Inspector”中,您可以看到第二个约束自动变为“身高> = 0.5“
适用于Xcode 7.3.1
答案 8 :(得分:0)
您将视图放在底部的单元格中。并将其设置为视图的深色。并将其高度设置为0.5 PX。你可以得到每个单元格的分隔符。根据单元格宽度保持宽度。
答案 9 :(得分:0)
而不是尝试根据分隔符样式设置视图高度。移除分隔符。 将单元格分隔符样式设置为StyleNone 然后在单元格的中间和底部添加两个高度为.5或1像素的视图。现在它看起来都相同并且具有分隔符样式。
答案 10 :(得分:0)
棘手的方式:
答案 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中以下列方式解决此问题,而不使用约束:
使用Interface Builder在故事板中添加UIView。根据需要设置此属性,只是为了直观地显示它在单元格中的外观(即高度= 44,宽度= 1)。此时宽度是否大于你所需的宽度并不重要(即0.5)。
在视图控制器中为此视图创建一个IBOutlet(即UIView * splitLine)。
在视图控制器的viewWillAppear:方法中添加以下方法:
[self.splitLine setFrame:CGRectMake(x,y,0.5,44)];
在此方法中,您可以将分隔线的宽度指定为0.5,将高度指定为所需的任何值。这些值会覆盖故事板中指定的值。