我在模拟微博客户端。git
要实现:
当一条微博包含 2-9 张图的时候,图片以九宫格形式展现(去除空白格子)。
当一条微博只包含一张图的时候,图片会比较大。github
如图所示,九宫格图片为Nine Pics
,底部按钮为3-button-panel
(这个命名很奇怪我知道:D),单张大图为One Pic
。spa
九宫格每张图的大小是 75px/75px,上下左右有 4px 的间距,因此总长宽为 233px/233px。code
单张大图的长宽为 200px/200px。图片
先无论单张大图的UIImageView
,将 view 里面其余元素经过 AutoLayout 设置好。九宫格的九张图片由于排布整齐,因此我直接用的一个 stackview。
设置Nine Pics
和3-button-panel
的间距为 8px。get
而后调整One Pic
大小为合适大小,用 Constrains 束缚住。经过键盘把One Pic
移动到和Nine Pics
左上角对齐的位置。(移动位置为了看起来更直观。全部的约束不是由在storyboard
上显示的位置决定的。)
将One Pic
左、上设置成和Nice Pics
同样的约束:左边 8px,上面 8px。博客
这个时候由于单张大图的高比九宫格的高小,因此看上去One Pic
和3-button-panel
的间距必定是大于 8px。it
可是约束的神奇就是这样。io
咱们如今设置One Pic
和3-button-panel
的间距为 8px。
这个时候,在3-button-panel
上就有两个上方的约束。
当咱们要显示单张大图的时候,经过代码隐藏九宫格self.ninePicsView.hidden = true
。此时,AutoLayout
就会忽略3-button-panel
和Nine Pics
之间的约束,而3-button-panel
和One Pic
之间的约束正常。
如图:
九宫格图片数量不够时,固然是经过hidden=true
隐藏多余的格子。
可是多是因为我用的stackview,因此隐藏第三排或者第二排和第三排以后,整个 view 的高度并无改变。(我没有尝试不用 stackview的状况,由于不想破坏辛辛苦苦作好的 storyboard :D。等有时间我再新建一个项目试试。)
因此须要手动改一下。
方法是,创建一个 Constraint Outlet,根据状况修改它的值。
以前咱们设置了3-button-panel
和Nine Pics
之间的距离是 8px。咱们创建一个这样的 IBOutlet:@IBOutlet weak var constraintButtonPanelAndNinePic: NSLayoutConstraint!
。这个时候,咱们就能够经过代码来修改约束值。
好比当有 6 张图片时,
self.seventhPic.hidden = true self.eighthPic.hidden = true self.ninethPic.hidden = true
隐藏多余的格子,而后
self.constraintButtonPanelAndNinePic.constant = -75
这个时候,3-button-panel
和Nine Pics
的相对位置就正确了。