在上一篇博客中详细的介绍了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中的代码如下:

  1. #import <Foundation/Foundation.h>
  2.  
  3. @protocol SourceManagerDelegate;
  4.  
  5. @interface SourceManager : NSObject
  6. //回调对象
  7. @property(nonatomic,weak)id<SourceManagerDelegate>delegate;
  8. //请求方法
  9. -(void)qingquWeibo;
  10.  
  11. @end
  12.  
  13. //-----协议
  14.  
  15. @protocol SourceManagerDelegate <NSObject>
  16. //source要回调的方法
  17. -(void)sourceManager:(SourceManager *)sm didReceiveWeiboText:(NSString *)text;
  18.  
  19. @end

  SourceManager.m的代码如下:

  1. #import "SourceManager.h"
  2.  
  3. @implementation SourceManager
  4.  
  5. -(void)qingquWeibo
  6. {
  7.  
  8. NSString *str;
  9.  
  10. //随机确定是那个字符串
  11. int i = arc4random()%;
  12. if (i)
  13. {
  14. //模拟请求要返回的字符串1
  15. str = @"iPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhoneiPhone";
  16. }
  17. else
  18. {
  19. //模拟请求要返回的字符串2
  20. str= @"iPhone";
  21.  
  22. }
  23.  
  24. //回调方法,返回text
  25. [self.delegate sourceManager:self didReceiveWeiboText:str];
  26.  
  27. }

  2.实现我们的模拟SourceManager的类以后就开始编写我们的ViewController的类。

    (1)给lable和lable下面的四个按钮在storyBoard添加约束,步骤如下:

      (2).给各个控件添加完约束后,我们需要在ViewController中添加我们要使用的控件和Label的垂直约束,代码如下

  1. //lable中的垂直约束,根据请求的text内容,用于动态的修改label的大小。
  2. @property (strong, nonatomic) IBOutlet NSLayoutConstraint *lableVConstraint;
  3.  
  4. //label用于设置请求的文字内容
  5. @property (strong, nonatomic) IBOutlet UILabel *myLabel;
  6.  
  7. //请求数据源的按钮
  8. @property (strong, nonatomic) IBOutlet UIButton *updateButton;
  9.  
  10. //sourceManagmer;获取数据
  11. @property (strong, nonatomic) SourceManager *sourceManager;

      

      (3).在viewDidLoad里面配置我们的数据源

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view, typically from a nib.
  5. //新建数据源
  6. self.sourceManager = [[SourceManager alloc] init];
  7.  
  8. //注册回调
  9. self.sourceManager.delegate = self;
  10. }

  

    (4).实现sourceManager要回调的方法,代码如下

  1. //sourceManage要回调的方法
  2. -(void)sourceManager:(SourceManager *)sm didReceiveWeiboText:(NSString *)text
  3. {
  4. //根据text调节myLable的高度
  5.  
  6. //先移除myLabel的垂直布局,之后在赋新的值
  7. [self.view removeConstraint:self.lableVConstraint];
  8.  
  9. //用字典设置字体的大小
  10. NSDictionary * dic = @{NSFontAttributeName: [UIFont systemFontOfSize:]};
  11.  
  12. //获取在固定宽度区域内存放请求的文字需要的范围
  13. CGRect bounds = [text boundingRectWithSize:CGSizeMake(, ) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
  14.  
  15. //创建新建垂直约束时的参数
  16. NSString *string = [NSString stringWithFormat:@"V:[_myLabel(%lf)]", bounds.size.height];
  17.  
  18. //给myLabel中创建新的垂直约束
  19. NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:string options: metrics:nil views:NSDictionaryOfVariableBindings(_myLabel)];
  20.  
  21. //更新垂直约束的值
  22. self.lableVConstraint = constraint[];
  23.  
  24. //添加新的约束
  25. [self.view addConstraint:self.lableVConstraint];
  26.  
  27. //设置myLabel的值
  28. self.myLabel.text = text;
  29.  
  30. }

    代码说明:

      1.在更新label的垂直约束之前先把原有的Constraint移除掉,注意:约束是加在约束组件的父类组件中。

      2.获取在固定宽度,特定字体时显示text需要空间的大小,返回值是一个CGRect类型的变量。

      3.把获取区域的高度设置成我们Label的垂直约束的值。

  代码补充:

  点击刷新按钮要出发的事件,点击刷新按钮会开启请求,这样回调才会有效。

  1. //点击按钮的时候请求数据
  2. - (IBAction)tapButton:(id)sender
  3. {
  4. //调用数据源的请求方法
  5. [self.sourceManager qingquWeibo];
  6. }

    就是全部代码和步骤,欢迎批评指正。

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. 浏览器的兼容问题 判断IE方法

    下面是一些判断ie的常用方法: <!-[if IE 6]> 此处是IE6才会执行的代码 <![endif]-> 还可以给他加个条件,比如判断IE6以下的浏览器: <!-[ ...

  2. Codeforces Round #361 (Div. 2) C

    C - Mike and Chocolate Thieves Description Bad news came to Mike's village, some thieves stole a bun ...

  3. redis 操作

    redis 1 启动服务 redis-2.8.20 wangchengcheng$ pwd /Users/wangchengcheng/Documents/GameJelly/server/redis ...

  4. iOS单例详解

    单例:整个程序只创建一次,全局共用. 单例的创建 // SharedPerson.h 文件中 + (instancetype)share; // SharedPerson.m 文件中 static S ...

  5. Android课程---关于数据存储的学习(3)之数据库和事务

    DataActivity3.java package com.hanqi.test5; import android.content.ContentValues; import android.dat ...

  6. CQOI 2016 不同的最小割

    题目大意:一个无向图,求所有点对不同的最小割种类数 最小割最多有n-1个,这n-1个最小割构成一个最小割树 分治法寻找n-1个最小割.对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和 ...

  7. c++ eof()函数

    C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...

  8. Reactive Extensions介绍

    Reactive Extensions(Rx)是对LINQ的一种扩展,他的目标是对异步的集合进行操作,也就是说,集合中的元素是异步填充的,比如说从Web或者云端获取数据然后对集合进行填充.Rx起源于M ...

  9. Hadoop学习笔记—6.Hadoop Eclipse插件的使用

    开篇:Hadoop是一个强大的并行软件开发框架,它可以让任务在分布式集群上并行处理,从而提高执行效率.但是,它也有一些缺点,如编码.调试Hadoop程序的难度较大,这样的缺点直接导致开发人员入门门槛高 ...

  10. java中构造方法的特殊性

    构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...