SA001-借助IBInspectable和约束定制1像素宽的线(view)

本文介绍了如何在Swift中借助IBInspectable和约束来创建1像素宽的线视图。在非Retina屏幕和Retina屏幕上,通过自定义UIView子类SA01BorderLineView,并在layoutSubviews中动态调整约束,实现线的显示。同时,利用@IBInspectable使属性在Storyboard中可实时预览和修改。
摘要由CSDN通过智能技术生成

        注意,本文的解决方案假定你:

        a.使用storyboard或者xib;

        b.使用autolayout自动布局;

        c.使用swift而非Objective-C语言。


        在进行产品开发的时候,我们经常遇到UI设计师给出1像素宽的间隔线。而这

种1像素宽的线,通常我们可以拖上一个view,将其宽或者高度设置为1。这在非

Retina屏上是没有问题的:1像素刚好对应的就是我们编程中的1个point,但在Retina

一个point则被映射成了2个像素,而在storyboard中设置约束或者frame的时候你是

没法设置小于1的值的,也即系统默认最小单位是1.该怎么办呢?

        目前我想到了这样的一个方法:使用autolayout的情况下,在storyboard中,

们按照一个点位(Point)布局我们的间隔线,这里我们用一个普通UIView将其宽度

或者高度约束设置为1(如果是横线设定高为1;如果竖线则定宽为1)。然后我们将

这个view的类名修改为我们定制的类名:SA01BorderLineView(继承自UIView)。

然后在这个类的重载方法layoutSubviews中,遍历其约束,找到定宽或者定高的约

束,根据屏幕是否是Retina屏来动态的修改约束的高度或者宽度值。

        在下面的示例代码中,我们将通过对比普通view来看是否我们达到了预期效果:

        首先定制一个SA01BorderLineView,直接继承自UIView,重载UIView的layoutSubviews

方法,遍历其约束,查找到定宽或者定高的约束(根据当前是横线还是竖线)。代

码如下:

@IBDesignable class SA01BorderLineView: UIView {

    @IBInspectable var isHorizontal: Bool = false

    override func layoutSubviews() {
        super.layoutSubviews()
        let layoutAttribute = self.isHorizontal ? NSLayoutAttribute.Height : NSLayoutAttribute.Width
        for item in self.constraints() {
            let constraint = item as NSLayoutConstraint
            if constraint.firstItem as UIView == self && constraint.firstAttribute == layoutAttribute {
                self.removeConstraint(constraint)
                constraint.constant = 1 / UIScreen.mainScreen().scale
                self.addConstraint(constraint)
            }
        }
    }

}

        注意代码中使用到了@IBInspectable和@IBDesignable,这两个关键字是swift

新引入的,用于定制的view等视图空间在xib或者storyboard中实现可视化定制新增

变量和实时渲染的功能。这里主要是因为我们引入了一个判断是否是横线的新增变量

:isHorizontal,想再storyboard中使用这个view的时候就能在storyboard中直接修改

它的值。截屏如下:


使用了IBInspectable关键字之后,能够在storyboard中直接修改相关属性值(方法1:通过runtime设置)



使用了IBInspectable关键字之后,能够在storyboard中直接修改相关属性值(方法2:通过类属性表设置)


运行效果图:



示例代码github地址:https://github.com/lihux/iLihuxDailyAccumulates,该仓库包含

两个工程,源码在swift工程的accumulates->A001文件夹下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值