IOS开发之自动布局显示网络请求内容
在上一篇博客中详细的介绍了IOS开发中的相对布局和绝对布局,随着手机屏幕尺寸的改变,在App开发中为了适应不同尺寸的手机屏幕,用自动布局来完成我们想要实现的功能和效果显得尤为重要。本人更喜欢使用相对布局。在下面要学习的例子中暂且先用我们的StoryBoard来设置我们组件的约束,以后会在代码中给我们的元素新建约束。iPhone4,5和将要发布的iPhone6的屏幕的大小都不一样,所以屏幕的适配是我们搞App开发必须要考虑的问题。
我们要完成一个什么例子呢,先上两张程序运行最终的结果图,之后看着图提出我们要实现的效果
界面要求:
1.下面刷新的按钮在3.5和4.0寸屏上离下面的bottom的距离都是为20点。
2.根据网络请求文字的内容的多少来动态的调整Lable的高度
3.当Label的高度变化时,下面的三个按钮的位置也相对于Lable的位置变化
下面我们就以代码结合着storyboard来实现上面的效果。
1.为了模拟网络请求,我们需要新建一个SourceManager类,和SourceManagerDelegate. 我们请求资源的时候用到的是委托回调,关于委托回调的内容请参考之前的博客ObjC中的委托模式。在SourceManager类中有一个qingquWeibo的方法,用于模拟网络请求。在SourceManagerDelegate协议中有一个-(void)sourceManager:(SourceManager *)sm didReceiveWeiboText:(NSString *)text; 用于回调。
SourceManager.h中的代码如下:
- #import <Foundation/Foundation.h>
- @protocol SourceManagerDelegate;
- @interface SourceManager : NSObject
- //回调对象
- @property(nonatomic,weak)id<SourceManagerDelegate>delegate;
- //请求方法
- -(void)qingquWeibo;
- @end
- //-----协议
- @protocol SourceManagerDelegate <NSObject>
- //source要回调的方法
- -(void)sourceManager:(SourceManager *)sm didReceiveWeiboText:(NSString *)text;
- @end
SourceManager.m的代码如下:
- #import "SourceManager.h"
- @implementation SourceManager
- -(void)qingquWeibo
- {
- NSString *str;
- //随机确定是那个字符串
- int i = arc4random()%;
- if (i)
- {
- //模拟请求要返回的字符串1
- str = @"iPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhone";
- }
- else
- {
- //模拟请求要返回的字符串2
- str= @"iPhone";
- }
- //回调方法,返回text
- [self.delegate sourceManager:self didReceiveWeiboText:str];
- }
2.实现我们的模拟SourceManager的类以后就开始编写我们的ViewController的类。
(1)给lable和lable下面的四个按钮在storyBoard添加约束,步骤如下:
(2).给各个控件添加完约束后,我们需要在ViewController中添加我们要使用的控件和Label的垂直约束,代码如下
- //lable中的垂直约束,根据请求的text内容,用于动态的修改label的大小。
- @property (strong, nonatomic) IBOutlet NSLayoutConstraint *lableVConstraint;
- //label用于设置请求的文字内容
- @property (strong, nonatomic) IBOutlet UILabel *myLabel;
- //请求数据源的按钮
- @property (strong, nonatomic) IBOutlet UIButton *updateButton;
- //sourceManagmer;获取数据
- @property (strong, nonatomic) SourceManager *sourceManager;
(3).在viewDidLoad里面配置我们的数据源
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- //新建数据源
- self.sourceManager = [[SourceManager alloc] init];
- //注册回调
- self.sourceManager.delegate = self;
- }
(4).实现sourceManager要回调的方法,代码如下
- //sourceManage要回调的方法
- -(void)sourceManager:(SourceManager *)sm didReceiveWeiboText:(NSString *)text
- {
- //根据text调节myLable的高度
- //先移除myLabel的垂直布局,之后在赋新的值
- [self.view removeConstraint:self.lableVConstraint];
- //用字典设置字体的大小
- NSDictionary * dic = @{NSFontAttributeName: [UIFont systemFontOfSize:]};
- //获取在固定宽度区域内存放请求的文字需要的范围
- CGRect bounds = [text boundingRectWithSize:CGSizeMake(, ) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
- //创建新建垂直约束时的参数
- NSString *string = [NSString stringWithFormat:@"V:[_myLabel(%lf)]", bounds.size.height];
- //给myLabel中创建新的垂直约束
- NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:string options: metrics:nil views:NSDictionaryOfVariableBindings(_myLabel)];
- //更新垂直约束的值
- self.lableVConstraint = constraint[];
- //添加新的约束
- [self.view addConstraint:self.lableVConstraint];
- //设置myLabel的值
- self.myLabel.text = text;
- }
代码说明:
1.在更新label的垂直约束之前先把原有的Constraint移除掉,注意:约束是加在约束组件的父类组件中。
2.获取在固定宽度,特定字体时显示text需要空间的大小,返回值是一个CGRect类型的变量。
3.把获取区域的高度设置成我们Label的垂直约束的值。
代码补充:
点击刷新按钮要出发的事件,点击刷新按钮会开启请求,这样回调才会有效。
- //点击按钮的时候请求数据
- - (IBAction)tapButton:(id)sender
- {
- //调用数据源的请求方法
- [self.sourceManager qingquWeibo];
- }
就是全部代码和步骤,欢迎批评指正。
IOS开发之自动布局显示网络请求内容的更多相关文章
- 解决ios开发中不合法的网络请求地址
NSString *const kWebsite = @"http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct ...
- 【iOS系列】-iOS开发,GET,POST请求使用
[iOS系列]-iOS开发,GET,POST请求使用 步骤: 1:实例化URL(网络资源) 2:根据URL建立URLRequest(网络请求) 默认为GET请求: 对于POST请求,需要创建请求的数据 ...
- iOS中使用block进行网络请求回调
iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...
- andriod开发,简单的封装网络请求并监听返回.
一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...
- iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面
1.多任务请求接口,完成后,在刷新数据,常用方法 2018年07月18日 16:34:38 hbblzjy 阅读数:1382 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- iOS开发证书都显示“此证书的签发者无效”,更新WWDR Certificate证书后还是显示无效
1.首先iOS开发证书显示"此证书的签发者无效".是因为WWDR Certificate证书过期导致的,须要更新WWDR Certificate证书! 1)下载最新WWDR Cer ...
- IOS 京东相关app 出现“网络请求失败,请检查您的网络设置”的解决办法
问题情况 在IOS系统下,下载安装或者更新新版的京东相关app之后,打开app直接就是“网络请求失败,请检查网络设置”,无论是数据连接还是wifi都试了,都是网络请求失败. 然而打开无线局域网-使用无 ...
- iOS 技术篇:如何处理多个网络请求的先后(依赖)关系
在开发过程中,不知你有没有碰到过在一个页面 用到了多个网络请求,而且根据业务需求,需要有次序的执行A B C 网络请求? 你可能会想到,我在A的请求成功回调里去处理B,在B的回调里去请求C,但你后来会 ...
随机推荐
- 浏览器的兼容问题 判断IE方法
下面是一些判断ie的常用方法: <!-[if IE 6]> 此处是IE6才会执行的代码 <![endif]-> 还可以给他加个条件,比如判断IE6以下的浏览器: <!-[ ...
- Codeforces Round #361 (Div. 2) C
C - Mike and Chocolate Thieves Description Bad news came to Mike's village, some thieves stole a bun ...
- redis 操作
redis 1 启动服务 redis-2.8.20 wangchengcheng$ pwd /Users/wangchengcheng/Documents/GameJelly/server/redis ...
- iOS单例详解
单例:整个程序只创建一次,全局共用. 单例的创建 // SharedPerson.h 文件中 + (instancetype)share; // SharedPerson.m 文件中 static S ...
- Android课程---关于数据存储的学习(3)之数据库和事务
DataActivity3.java package com.hanqi.test5; import android.content.ContentValues; import android.dat ...
- CQOI 2016 不同的最小割
题目大意:一个无向图,求所有点对不同的最小割种类数 最小割最多有n-1个,这n-1个最小割构成一个最小割树 分治法寻找n-1个最小割.对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和 ...
- c++ eof()函数
C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...
- Reactive Extensions介绍
Reactive Extensions(Rx)是对LINQ的一种扩展,他的目标是对异步的集合进行操作,也就是说,集合中的元素是异步填充的,比如说从Web或者云端获取数据然后对集合进行填充.Rx起源于M ...
- Hadoop学习笔记—6.Hadoop Eclipse插件的使用
开篇:Hadoop是一个强大的并行软件开发框架,它可以让任务在分布式集群上并行处理,从而提高执行效率.但是,它也有一些缺点,如编码.调试Hadoop程序的难度较大,这样的缺点直接导致开发人员入门门槛高 ...
- java中构造方法的特殊性
构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...