加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 视图水平和垂直模糊,布局复杂

发布时间:2020-12-14 18:11:44 所属栏目:百科 来源:网络整理
导读:我的故事板上有一个UIViewController,它有两个水平左右的子视图.我添加了约束来将前沿和后沿修复为常量(20分),并添加另一个约束来保持宽度相等.如果我假设以下内容,应该可以计算每个子视图的宽度需要: 子视图不重叠 目前没有其他观点(至少水平) 屏幕的宽度(
我的故事板上有一个UIViewController,它有两个水平左右的子视图.我添加了约束来将前沿和后沿修复为常量(20分),并添加另一个约束来保持宽度相等.如果我假设以下内容,应该可以计算每个子视图的宽度需要:

>子视图不重叠
>目前没有其他观点(至少水平)
>屏幕的宽度(超视图)是已知的

但是,XCode给了我一个警告,我的观点是横向模糊的.我猜这意味着XCode没有做出这些假设之一,但它是哪一个?有没有办法让我指示XCode做出这个假设?

编辑:好的,玩了一下并得到警告消失,但看起来它没有做出第一个假设 – 它只是将每个子视图的宽度设置为superview.width – 40,并愉快地将一个视图埋在另一个视图之下.所以问题是如何阻止它们重叠?

编辑2:好的,我的实际屏幕比我的简单示例复杂得多.这是我得到的:

所以在这个设置中我有4个垂直和水平交错的视图.我希望蓝色,红色和紫色的视图都是相同的subview.frame.size.width = superview.width – 60.蓝色和紫色在左列中排列,红色在右列中单独排列,以及所有间隙(两列之间以及每列之间及其最近边缘)均为常数(20 pts).这三个表有一个可变的高度,我将按照James’s answer here中的描述以编程方式设置.底部是一个粉红色的视图,它拉伸屏幕的宽度(减去间隙),并且位于紫色或低于20的常数处.红色视图,以较低者为准(我试图通过给每个视图赋予一个> = 20的间距约束,我希望它会为其中一个选择正好20个).由于所有高度都是动态的,并且可能不一定同时适合屏幕,因此我将他们的superview设置为UIScrollView而不是普通的UIView.

完成所有操作后,我仍然会收到警告,我的所有4个视图都是水平模糊的,并且粉红色条是垂直模糊的.我认为它很难实现应该接下来的东西,这就是为什么它认为它是横向模糊的.而且我认为不会选择将粉红色的条纹放在紫色或红色视图下方20个点以下,这就是为什么它认为它是垂直模糊的.任何人都可以确认或否认这些怀疑吗?或建议一个方法呢?当我最后运行它时,我得到了这个(我将滚动视图的背景变为黄色,你在故事板截图中无法分辨):

解决方法

垂直模糊

好吧,我想我已经解决了垂直模糊的部分.我在粉红色和紫色视图之间添加了两个垂直约束,在粉红色和红色视图之间添加了两个垂直约束.对于每对,第一个约束是它们之间的间距必须> 20分,它有1000个优先权.第二个约束是间距= 20 pts,但它只有800优先级.

例如,如果紫色视图的底部最终低于红色视图的底部(就像在我的第一个屏幕截图中那样),Xcode应该尝试设置粉红色和红色视图之间的垂直距离= 20,但它将意识到与紫色和粉红色之间的空间> = 20的条件冲突.由于> =约束具有更高的优先级,因此将忽略=约束.现在,当Xcode查看紫色和粉红色视图之间的间距= 20的约束时,它会根据约束检查粉红色和红色必须至少相隔20个.因为红色视图的底部高于在紫色视图的底部,红色和粉红色之间的> = 20约束仍然通过.

所以TL; DR,您可以设置一个视图,使其在多个视图中最极端的给定值(x)处有一个间距,方法是给它一个带有1000优先级的> = x约束,并用&lt赋予它一个= x约束;您正在考虑的每个视图的1000优先级 – 我的垂直模糊问题已经解决.我还没有针对所有4个视图的水平模糊度的解决方案.

水平模糊

好的,我现在也修复了水平模糊的部分.它归结为滚动视图(以及表视图)中的约束与其他任何类型的视图的工作方式不同.这是一步一步的样子.

>放置UIScrollView
>将UIView放入UIScrollView中,作为该滚动视图的“contentView”
>添加约束以将contentView固定到滚动视图的所有4个角并固定它的宽度和高度(因此在contentView和它的superview之间有6个约束 – 比平时多2个).请注意,宽度和高度可以固定为比正常屏幕大小大得多的东西,这可能是您开始使用滚动视图的原因.
>在UIScrollView中添加你想要的所有其他视图(UIButtons,UILabels等等 – 我将从这里开始假设UILabel所以我不必输入那么多,但是任何类型的UIView子类都可以工作)作为contentView的子视图,不直接作为UIScrollView的子视图

通过这种设置,给予超级视图约束的UILabel将约束到具有已定义大小的contentView,因此没有任何歧义.

或者,如果要修复UILabel的大小(或根据应用程序的功能动态计算它们),并让contentView展开以保存它们:

>放置UIScrollView
>将UIView放入UIScrollView中,作为该滚动视图的“contentView”
>添加约束以将contentView固定到滚动视图的所有4个角并将其固定为宽度和高度
>为contentView上的宽度约束创建一个出口(假设我们将其命名为contentViewWidthConstraint)
>放置UILabels
>修复UILabels的大小
>为UILabels的宽度约束创建一个出口

然后在viewWillLayoutSubviews的代码中

>将所有UILabel的宽度和它们之间的任何间隙加起来(作为CGFloat,我将其称为totalWidth)
> set contentViewWidthConstraint.constant = totalWidth

你很高兴去!请注意,我假设您在此示例的大部分内容中设置了宽度,但它应该适用于高度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读