不规则图形布局

       前两天做了一个不规则图形布局,由于当初做时没有考虑清楚布局的思路和实现的逻辑,所以走了不少弯路,试了很多办法才做出来的。现在有时间,将这类UI的布局思路先记下来,以防日后自己再遇到还会吃亏。

一、多排不规则图形的布局

       类似这种不规则图形的布局,为了方便适配,必须让所有按钮按比例布局,否则无法完美适配各种机型的屏幕。但这里有个问题,按钮的宽高比是一定的,所以我们必须将其中一个(宽高)作为基准才能按比例摆放。从UI效果图来看,以宽度作为基准比较合适,考虑到按钮摆放的位置应该是以宽度为准,高度动态增长来设计的,否则按钮距离左右边距会发生变化,且若按高度来算,宽度有可能会出现超过屏宽或离左右边距太多的情况,所以我是按宽度为基准来布局的。

        这里还有一个问题就是宽度可以很容易固定(只需要添加左右边距约束即可),但是高度却是时时变化的(随屏宽不同而改变),所以若是按单个按钮布局,就很难将这几个按钮的中心点摆放在背景图的中心上(不可固定按钮的上下边距)。我尝试了多种方法,最后的灵感是将这几个按钮放到一个自己手动添加的view中,view只需要添加左右边距约束,并将Y轴的中心与背景图中心设为相等即可,然后在view里面添加这些按钮,view的大小会随着按钮的大小而改变,这样就可以完美的实现这种不规则图形的布局了。还有最重要的一点,一定要将中间的按钮摆放在最上层,否则它的点击事件会被其他按钮覆盖。

二、一排不规则图形的布局

        看到这个UI效果图,首先脑海里想到的方法跟以往的布局一样,将三个按钮分别添加约束,并按照比例摆放。由于这是个不规则图形,不能简单的将按钮三等分,所以做法是将左右两个按钮的边距固定,中间按钮的中心点与背景图中心相等,以高度为基准来算按钮宽度,这样适配屏幕一定是没有问题的(第一次只在6上面运行了,效果和设计图一样)。

        按理说,切换屏幕得到的效果应该是一样的,但是我却忽略了一个最重要的问题,跟第一种布局一样,UI效果图都是以宽度为基准来设计的,可是我在这里却以高度为基准来布局(因为宽度无法固定,与第一种情况略有差异),所以切换屏幕得到的效果会导致按钮之间的间距变大,十分不美观。之后的想法是通过手动修改图片的尺寸(保持按钮的大小不变),让图片之间的间距变小,看起来更接近UI的效果。刚开始在6plus上调试的结果是可以的,基本可以达到UI的效果,但是切换到5上面就不行了,因为5和6都是加载的@2x的图片,且5上的图片显示已经达到按钮的最大饱满度了,再手动修改图片尺寸,会导致图片显示不全,在6上也会受到影响,所以放弃了这种做法。最后参考安卓同事的建议,将图片切成整个背景的,只是将后面的按钮处理成透明,这样一来,三个按钮的约束都是相同的,左右边距均为0 ,以宽度为基准算高度,适配就不会再有任何问题了。

      到这里,不规则图形的布局已经完美的解决了,但是功能却有缺陷,因为三个按钮的位置是完全重叠在一起的,所以不管你点击哪个按钮,响应的永远是最上层的按钮(底下按钮的点击事件被覆盖了)。要怎么解决这个问题呢,很简单,只要让按钮的响应区域为图片可视范围即可(即是通过图片的透明度来判断按钮的点击能力),这里有两个思路:1、重写按钮的点击范围方法(- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event  ),可以在这里画出按钮的响应区域,如圆形,三角形等等(用贝塞尔曲线实现),这种做法不需要判断图片透明度,相对来说比较简单,但是该方法仅适用于不规则图形是一类的情况(在这里就不适用,因为三个按钮的图形都不相同);2、首先获取图片的透明度,然后通过透明度来判断按钮的点击能力,该方法较为复杂,但是适用性广,适用于任何图形的按钮(原理现在还没看懂,先收藏,以后有时间再慢慢钻研)。

获取图片透明度
判断图片的透明度
按钮的响应能力

        这个方法的实现可以是按钮的类别,或者自定义按钮都可以,看个人喜好,如果是通过类别实现,则不需要做任何事情,如果是通过自定义按钮实现,只需要将按钮关联起来即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • JS 变量松散类型的本质,决定了变量只是在特定时间保存特定值的一个名字而已,而不存在定义某个变量的数据类型的规则,...
    饥人谷_Vomx阅读 285评论 0 0
  • 距离上次去雪家已经快一个多月了,有点想念,顺便也看看她宝贝长得有多大了,新生婴儿是长得很快的。上次去,还没长开呢...
    珙桐chen阅读 161评论 0 0
  • 梦在哪里?梦在你日常的生活里。 梦在哪里?梦在你前行的路途上。 梦在哪里?梦在你回眸的一瞬间。 梦在哪里?梦在你仰...
    lm85阅读 167评论 0 1