在上一篇博客中详细的介绍了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开发之自动布局显示网络请求内容的更多相关文章

  1. 解决ios开发中不合法的网络请求地址

    NSString *const kWebsite = @"http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct ...

  2. 【iOS系列】-iOS开发,GET,POST请求使用

    [iOS系列]-iOS开发,GET,POST请求使用 步骤: 1:实例化URL(网络资源) 2:根据URL建立URLRequest(网络请求) 默认为GET请求: 对于POST请求,需要创建请求的数据 ...

  3. iOS中使用block进行网络请求回调

    iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...

  4. andriod开发,简单的封装网络请求并监听返回.

    一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...

  5. iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面

    1.多任务请求接口,完成后,在刷新数据,常用方法 2018年07月18日 16:34:38 hbblzjy 阅读数:1382 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  6. iOS开发 - Swift实现检测网络连接状态及网络类型

    一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...

  7. iOS开发证书都显示“此证书的签发者无效”,更新WWDR Certificate证书后还是显示无效

    1.首先iOS开发证书显示"此证书的签发者无效".是因为WWDR Certificate证书过期导致的,须要更新WWDR Certificate证书! 1)下载最新WWDR Cer ...

  8. IOS 京东相关app 出现“网络请求失败,请检查您的网络设置”的解决办法

    问题情况 在IOS系统下,下载安装或者更新新版的京东相关app之后,打开app直接就是“网络请求失败,请检查网络设置”,无论是数据连接还是wifi都试了,都是网络请求失败. 然而打开无线局域网-使用无 ...

  9. iOS 技术篇:如何处理多个网络请求的先后(依赖)关系

    在开发过程中,不知你有没有碰到过在一个页面 用到了多个网络请求,而且根据业务需求,需要有次序的执行A B C 网络请求? 你可能会想到,我在A的请求成功回调里去处理B,在B的回调里去请求C,但你后来会 ...

随机推荐

  1. 使用专业的消息队列产品rabbitmq之centos7环境安装

      我们在项目开发的时候都不可避免的会有异步化的问题,比较好的解决方案就是使用消息队列,可供选择的队列产品也有很多,比如轻量级的redis, 当然还有重量级的专业产品rabbitmq,rabbitmq ...

  2. (转载)SQL去除回车符,换行符,空格和水平制表符

    http://www.cnblogs.com/insus/p/4815336.html MS SQL去除回车符,换行符,空格和水平制表符,参考下面语句,一般情况是SQL接受富文本或是textarea的 ...

  3. iOS高性能设置圆角

    自建一个分类可以设置. -(void)cornerImageWithSize:(CGSize)size fillColor:(UIColor *)fillColor completion:(void( ...

  4. GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)

    重点介绍如何利用50元左右的设备,抓包并还原SMS短信内容: ps:研究GSM Sniffing纯属个人兴趣,能抓SMS报文只是捡了个明文传输的漏子,切勿用于非法用途.就像sylvain说的,osmo ...

  5. printf在终端输出时改变颜色

    在调试程序时,有时候要输出大量数据,如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了. 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.转义序 ...

  6. CSS Grid layout布局

    CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,主要目的是改变我们基于网格设计的用户接口方式.你只需要定义一个容器元素并设置display:grid,使用gr ...

  7. Js获取fileupload的绝对路径时总是的到C:\fakepath\+文件名称的 解决方案

    解决方法: Internet选项->安全->自定义级别->将文件下载到服务器时包含本地目录路径  启用就可以了.

  8. .net 实现注册邮箱验证激活

    没事上网当了个注册邮箱验证激活的代码,用起来感觉还不错,特意和大家要一起分享一下 下面是主要实现代码: uing System.Net.Mail; public partial class jquer ...

  9. 【转】unity3d的常用快捷键

    Unity3D默认的快捷键. shift +方向键             向“向方向键前进” Windows系统Unity3D中的快捷键 组合键 键 功能 File 文件 Ctrl   N New ...

  10. iOS UIWebView 加载进度条的使用-WKWebView的使用,更新2017.6.26

    1.由于项目中加载网络插件,直接使用了webview加载.使用了三方NJKWebViewProgress进度条的使用,近期在测试时发现,网络缓慢时出现白屏,有卡顿现象. 于是采用了WKWebView进 ...