热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

根据JSON响应锚定UI元素

我需要创建一个视图层,该视图层由根据api响应布置的组件组成。想象一

我需要创建一个视图层,该视图层由根据api响应布置的组件组成。

想象一下,我有一个类似于-

的JSON响应

{
"id":"1fbcf51b-1811-405d-ba92-de5110910f83","name":"Gaming day","contentTemplate":{
"id":"300c01c3-747e-4446-8193-c2d633bfa8da","name":"Social Announcement","defaultLayoutId":"article","layouts":[
{
"id":"article","body":[
{
"classType":"CONTAINER","category":"CONTAINER","type":"FULL_WIDTH","elements":[
{
"classType":"TEXT","category":"INPUT","type":"TITLE","fieldId":"title"
},{
"classType":"TEXT","type":"SUMMARY","fieldId":"subtitle"
},{
"classType":"IMAGE","type":"IMAGE","fieldId":"mainImage"
},"type":"RICH_TEXT","fieldId":"body"
}
]
},{
"classType":"CONTAINER","type":"TWO_COLUMN_GRID","elements":[
{
"classType":"IMAGE","fieldId":"image1"
},"fieldId":"body1"
},"fieldId":"body2"
},"fieldId":"image2"
}
]
},"elements":[
{
"classType":"MetaDATA","category":"MetaDATA","type":"RELATED_ARTICLES"
}
]
}
]
}
]
}
}

在这里您可以看到layouts包含一个元素数组,所有元素都是相同的类型,有些元素具有更多的可选属性,有些元素还具有嵌套的元素。

它从本质上描述了组件及其呈现方式


  1. 全宽行,堆叠了4个元素

  2. 2列网格,其中元素堆叠在两列中

  3. 全宽行,包含单个元素

这看起来像这样-

根据JSON响应锚定UI元素

这是一个示例,但是其他布局将遵循此JSON结构。

在非常高的层次上,我将每个组件构建为UIView的子类,并允许它接受各种模型,以设置显示的每个元素的数据。它们都将符合LayoutComponent协议,并设置一些标准值。在这一点上,这很简单。

然后我将使用工厂为给定类型“构建”组件。

因为所有内容都是UIView的子类,所以我应该没事。

在这一点上我不确定的是如何处理相互之间的组件布局。每个组件的内部布局都很简单,因为我可以将元素固定在需要知道的位置,因为我知道每个组件中存在哪些元素。

由于布局是动态的,当涉及将这些元素的总和锚定到演示文稿UIView的{​​{1}}时,我不知道如何分辨最后一个UIViewController元素固定到底部,之前的元素固定到其底部等。

如果感觉我可能最终会收到大量FULL_WIDTH语句和自动布局代码。



只要每个子元素具有固有的内容大小或堆栈方向的约束(水平堆栈的宽度和垂直堆栈的高度),UIStackView就会为您执行此操作。

整个东西应该是一个垂直的堆栈视图,每一行应该是一个水平的堆栈视图。如果您认为它会比屏幕大,则将其放在scrollview中,并将垂直堆栈锚定到contentLayoutGuide上,其宽度限制应等于scrollViews父级;然后它只会垂直滚动到太大而无法显示。

Apple的Stackview指南:https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/LayoutUsingStackViews.html

,

我建议您使用UICollectionView来完成此任务。
此类实现单元的重用,并且在显示列表时不会消耗大量内存

您需要一个单元,例如ImageCell,TextCell和其他元素。此单元格应为指定大小的绘图内容(使用sizeThatFits和layoutSubviews或自动布局)

要实现一些布局规则,您有两种可能的方法:

1)创建自定义UICollectionViewLayout doc from Apple

2)另一种方法是创建布局单元格,例如TwoColumnCell,FullWidthCell。并添加像子视图这样的元素单元来布局单元。

第二种方法打破了单元的重用,因为您不能将单元重用于具体的元素类型。
而且您可以基于UIView而不是UICollectionView来实现这种方式。想法是用于布局的单元格类别很少,而用于绘制内容的单元格类别很少


推荐阅读
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
主宰魔尊_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有