控件自定义边框及控件layer边框特点

       《一》

        对于iOS控件,很容易使用控件的layer设置border的属性,有borderColor,borderWidth可设置控件四个边框的颜色和宽度。但,有些需求要求控件的边框不是四个。有些控件虽需要四边框,当两个控件上下或左右相邻时,相邻边框就会变得很粗,不协调。为了实现特殊需求或环境下控件边框,需要自定义,即自己在控件内部,画出相应的边。

      比如,我的需求。一个展示评论的cell中,会出现一楼,二楼,三楼等框起来的评论,楼层上下罗列,如草图:



       我先讲楼层框用一个单独的view实现,在这个view中按位置摆放相应的控件并设置view的layer的borderColor和borderWidth。再以view为对象,贴到cell中。会发现,当cell中出现多个楼层时,上下相邻的楼层相邻处的线,是两个楼层borderWidth的2倍,显的线条粗,不协调。

      我的解决办法是,删除通过borderColor,borderWidth设置的layer边框,通过向view的layer上添加上下左右方向的1像素的layer实现边框的设置。代码如下:

      

        //上边框

        CALayer * topBorder = [CALayer layer];

        topBorder.frame = CGRectMake(0.0f, 0.0f, self.bounds.size.width, 1.0f);

        topBorder.backgroundColor = borderColor.CGColor;

        [self.layer addSublayer:topBorder];

        //左边框

        CALayer * leftBorder = [CALayer layer];

        leftBorder.frame = CGRectMake(0.0f, 0.0f, 1.0f, self.bounds.size.height);

        leftBorder.backgroundColor = borderColor.CGColor;

        [self.layer addSublayer:leftBorder];

        //下边框

        self.bottomBorder = [CALayer layer];

        self.bottomBorder.frame = CGRectMake(0.0f, (self.bounds.size.height - 1), self.bounds.size.width, 1);

        self.bottomBorder.backgroundColor = borderColor.CGColor;//没有贴到view上

        //右边框

        CALayer * rightBorder = [CALayer layer];

        rightBorder.frame = CGRectMake((self.bounds.size.width - 1), 0.0, 1.0, self.bounds.size.height);

        rightBorder.backgroundColor = borderColor.CGColor;

        [self.layer addSublayer:rightBorder];

     我在view内部,将上左右边框,实例化后,贴到view上。下边框设置成view的属性,在view内部实例化下边框,没有贴到view上。当向cell上贴view时,会判断,是否是最后一个view框,如果是,则将下边框贴到view上。

     完美~

     《二》

     其中,我还发现一个用layer的borderColor,borderWidth设置边框的特性。

     在开发中,会遇到在界面的某处,设置了两个或多个可点击的控件,点击控件伴随着切换到相对应的列表中。以两个按钮为例,如图:

    实现按钮一和按钮二及小红条。我将按钮一,按钮二,和小红条贴到view上,并设用layer的borderColor,borderWidth设置边框,实现上下边框(左右边框看不到)。根据需求,小红条高度为2pt,底边压在1pt的下边框上。我设置了正确的小红条的frame。发现小红条只显示下边框上面的1pt,然后无论如何改变小红条的frame的y和height(将小红条高度修改为20pt),调整小红条位于view的最上层,设置view的clipsToBounds为no,都无法覆盖着下边框。

    得出结论,边框不能被内部控件覆盖。也是一个很重要的特性。

    为与效果图上小红条的位置和显示一致,我去掉了边框的设置,用UILable创建下边框线。kill掉了当时不用控件设置边框,而通过设置layer的边框的想法。

    也许,我上边表述的问题,你会觉得不值得一提。写者我要说,另辟思路,通过减少控件的创建,控件的堆叠,来达到效果,未尝不可呢。况且,尝试自己的想法是一个好的趋势,说不一定哪天,自己会拥有超出别人,很伟大的idea,加油。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值