iOS 图片选择器(仿微信)

HarveyDMIJ 7年前
   <p>照片选择器是APP开发中经常使用的功能.比如对商品的评价,某些报告提交等都会用到.</p>    <p>你只要继承我demo的HWPublishBaseController就可以了.在下面有说明.我在demo设置的是最多上传9张照片,你可以自己根据需求修改,在工程中搜索</p>    <pre>  <code class="language-objectivec">#define kMaxImageCount 9</code></pre>    <p>这是我在项目中的使用,如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ac418d79a8241243a5948ca0855729b0.png"></p>    <p> </p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1e068c98560986b0d18065ce9936e3a6.png"></p>    <p> </p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f485bba408b69c7b0439e7ef0e1f5de9.png"></p>    <p> </p>    <p>不废话,直接上代码.其中用了第三方的东西.我demo中的EvaluateViewController页是写功能的主要看这个页面就可以.它如上面所说就是继承的HWPublishBaseController.demo中的代码说明的很详细可以参照此样式自定义页面.先说一说Base页面.</p>    <p>这是Base页面,你可以新建一个页面继承它,然后自定义页面样式.其中你可以根据需求是要大图的数据信息还是缩放的小图信息.这是小图的://方形压缩图image 数组 @property(nonatomic,strong) NSMutableArray <em>imageArray;这是大图的- (NSArray</em> )getBigImageArray;上传图片就要根据需求了,网上有很多.</p>    <p>首先是.h文件</p>    <pre>  <code class="language-objectivec">//  //  HWPublishBaseController.h  //  PhotoSelector  //  //  Created by 洪雯 on 2017/1/12.  //  Copyright © 2017年 洪雯. All rights reserved.  //    #import <UIKit/UIKit.h>  #import <AssetsLibrary/AssetsLibrary.h>  #import "HWCollectionViewCell.h"  #import "JJPhotoManeger.h"  #import "HWImagePickerSheet.h"    @protocol HWPublishBaseViewDelegate <NSObject>    @optional    @end    @interface HWPublishBaseController : UIViewController    @property (nonatomic, assign) id<HWPublishBaseViewDelegate> delegate;    @property (nonatomic, strong) UICollectionView *pickerCollectionView;    @property (nonatomic, assign) CGFloat collectionFrameY;    //选择的图片数据  @property(nonatomic,strong) NSMutableArray *arrSelected;    //方形压缩图image 数组  @property(nonatomic,strong) NSMutableArray * imageArray;    //大图image 数组  @property(nonatomic,strong) NSMutableArray * bigImageArray;    //大图image 二进制  @property(nonatomic,strong) NSMutableArray * bigImgDataArray;    //图片选择器  @property(nonatomic,strong) UIViewController *showActionSheetViewController;    //collectionView所在view  @property(nonatomic,strong) UIView *showInView;    //图片总数量限制  @property(nonatomic,assign) NSInteger maxCount;      //初始化collectionView  - (void)initPickerView;  //修改collectionView的位置  - (void)updatePickerViewFrameY:(CGFloat)Y;  //获得collectionView 的 Frame  - (CGRect)getPickerViewFrame;    //获取选中的所有图片信息  - (NSArray*)getSmallImageArray;  - (NSArray*)getBigImageArray;  - (NSArray*)getALAssetArray;    - (void)pickerViewFrameChanged;    @end</code></pre>    <p>这是.m文件 在新建页面调用 [self initPickerView];这个方法是 初始化collectionView 然后根据需求调用updatePickerViewFrameY这个方法这个是修改collectionView的位置即照片的显示位置.</p>    <pre>  <code class="language-objectivec">//  //  HWPublishBaseController.m  //  PhotoSelector  //  //  Created by 洪雯 on 2017/1/12.  //  Copyright © 2017年 洪雯. All rights reserved.  //    #import "HWPublishBaseController.h"    @interface HWPublishBaseController ()<UICollectionViewDelegate,UICollectionViewDataSource,JJPhotoDelegate,HWImagePickerSheetDelegate>{      NSString *pushImageName;      //添加图片提示      UILabel *addImageStrLabel;  }    @property (nonatomic, strong) HWImagePickerSheet *imgPickerActionSheet;    @end    @implementation HWPublishBaseController    static NSString * const reuseIdentifier = @"HWCollectionViewCell";    -(instancetype)init{      self = [super init];      if (self) {          if (!_showActionSheetViewController) {              _showActionSheetViewController = self;          }      }      return self;  }    - (void)viewDidLoad {      [super viewDidLoad];      // Do any additional setup after loading the view.  }    /** 初始化collectionView */  -(void)initPickerView{      _showActionSheetViewController = self;        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];      self.pickerCollectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];      if (_showInView) {          [_showInView addSubview:self.pickerCollectionView];      }else{          [self.view addSubview:self.pickerCollectionView];      }        self.pickerCollectionView.delegate=self;      self.pickerCollectionView.dataSource=self;      self.pickerCollectionView.backgroundColor = [UIColor whiteColor];        if(_imageArray.count == 0)      {          _imageArray = [NSMutableArray array];      }      if(_bigImageArray.count == 0)      {          _bigImageArray = [NSMutableArray array];      }      pushImageName = @"plus.png";        _pickerCollectionView.scrollEnabled = NO;        //上传图片提示      addImageStrLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 50, 70, 20)];      addImageStrLabel.text = @"上传图片";      addImageStrLabel.textColor = [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1.0];      [self.pickerCollectionView addSubview:addImageStrLabel];  }    #pragma mark <UICollectionViewDataSource>    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {      return 1;  }      - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {      return _imageArray.count+1;  }    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {        // Register nib file for the cell      UINib *nib = [UINib nibWithNibName:@"HWCollectionViewCell" bundle: [NSBundle mainBundle]];      [collectionView registerNib:nib forCellWithReuseIdentifier:@"HWCollectionViewCell"];      // Set up the reuse identifier      HWCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: @"HWCollectionViewCell" forIndexPath:indexPath];        if (indexPath.row == _imageArray.count) {          [cell.profilePhoto setImage:[UIImage imageNamed:pushImageName]];          cell.closeButton.hidden = YES;            //没有任何图片          if (_imageArray.count == 0) {              addImageStrLabel.hidden = NO;          }          else{              addImageStrLabel.hidden = YES;          }      }      else{          [cell.profilePhoto setImage:_imageArray[indexPath.item]];          cell.closeButton.hidden = NO;      }      [cell setBigImageViewWithImage:nil];      cell.profilePhoto.tag = [indexPath item];        //添加图片cell点击事件      UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapProfileImage:)];      singleTap.numberOfTapsRequired = 1;      cell.profilePhoto .userInteractionEnabled = YES;      [cell.profilePhoto  addGestureRecognizer:singleTap];      cell.closeButton.tag = [indexPath item];      [cell.closeButton addTarget:self action:@selector(deletePhoto:) forControlEvents:UIControlEventTouchUpInside];        [self changeCollectionViewHeight];      return cell;  }  #pragma mark <UICollectionViewDelegate>  //定义每个UICollectionView 的大小  - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath  {      return CGSizeMake(([UIScreen mainScreen].bounds.size.width-64) /4 ,([UIScreen mainScreen].bounds.size.width-64) /4);  }    //定义每个UICollectionView 的 margin  - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section  {      return UIEdgeInsetsMake(20, 8, 20, 8);  }    #pragma mark - 图片cell点击事件  //点击图片看大图  - (void) tapProfileImage:(UITapGestureRecognizer *)gestureRecognizer{      [self.view endEditing:YES];        UIImageView *tableGridImage = (UIImageView*)gestureRecognizer.view;      NSInteger index = tableGridImage.tag;        if (index == (_imageArray.count)) {          [self.view endEditing:YES];          //添加新图片          [self addNewImg];      }      else{          //点击放大查看          HWCollectionViewCell *cell = (HWCollectionViewCell*)[_pickerCollectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];          if (!cell.BigImageView || !cell.BigImageView.image) {                [cell setBigImageViewWithImage:[self getBigIamgeWithALAsset:_arrSelected[index]]];          }            JJPhotoManeger *mg = [JJPhotoManeger maneger];          mg.delegate = self;          [mg showLocalPhotoViewer:@[cell.BigImageView] selecImageindex:0];      }  }  - (UIImage*)getBigIamgeWithALAsset:(ALAsset*)set{      //压缩      // 需传入方向和缩放比例,否则方向和尺寸都不对      UIImage *img = [UIImage imageWithCGImage:set.defaultRepresentation.fullResolutionImage                                         scale:set.defaultRepresentation.scale                                   orientation:(UIImageOrientation)set.defaultRepresentation.orientation];      NSData *imageData = UIImageJPEGRepresentation(img, 0.5);      [_bigImgDataArray addObject:imageData];        return [UIImage imageWithData:imageData];  }  #pragma mark - 选择图片  - (void)addNewImg{      if (!_imgPickerActionSheet) {          _imgPickerActionSheet = [[HWImagePickerSheet alloc] init];          _imgPickerActionSheet.delegate = self;      }      if (_arrSelected) {          _imgPickerActionSheet.arrSelected = _arrSelected;      }      _imgPickerActionSheet.maxCount = _maxCount;      [_imgPickerActionSheet showImgPickerActionSheetInView:_showActionSheetViewController];  }    #pragma mark - 删除照片  - (void)deletePhoto:(UIButton *)sender{        [_imageArray removeObjectAtIndex:sender.tag];      [_arrSelected removeObjectAtIndex:sender.tag];          [self.pickerCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:sender.tag inSection:0]]];        for (NSInteger item = sender.tag; item <= _imageArray.count; item++) {          HWCollectionViewCell *cell = (HWCollectionViewCell*)[self.pickerCollectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:item inSection:0]];          cell.closeButton.tag--;          cell.profilePhoto.tag--;      }        [self changeCollectionViewHeight];  }    #pragma mark - 改变view,collectionView高度  - (void)changeCollectionViewHeight{        if (_collectionFrameY) {          _pickerCollectionView.frame = CGRectMake(0, _collectionFrameY, [UIScreen mainScreen].bounds.size.width, (((float)[UIScreen mainScreen].bounds.size.width-64.0) /4.0 +20.0)* ((int)(_arrSelected.count)/4 +1)+20.0);      }      else{          _pickerCollectionView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, (((float)[UIScreen mainScreen].bounds.size.width-64.0) /4.0 +20.0)* ((int)(_arrSelected.count)/4 +1)+20.0);      }      [self pickerViewFrameChanged];    }  /**   *  相册完成选择得到图片   */  -(void)getSelectImageWithALAssetArray:(NSArray *)ALAssetArray thumbnailImageArray:(NSArray *)thumbnailImgArray{      //(ALAsset)类型 Array      _arrSelected = [NSMutableArray arrayWithArray:ALAssetArray];      //正方形缩略图 Array      _imageArray = [NSMutableArray arrayWithArray:thumbnailImgArray] ;        [self.pickerCollectionView reloadData];  }  - (void)pickerViewFrameChanged{    }  - (void)updatePickerViewFrameY:(CGFloat)Y{        _collectionFrameY = Y;      _pickerCollectionView.frame = CGRectMake(0, Y, [UIScreen mainScreen].bounds.size.width, (((float)[UIScreen mainScreen].bounds.size.width-64.0) /4.0 +20.0)* ((int)(_arrSelected.count)/4 +1)+20.0);  }    #pragma mark - 防止奔溃处理  -(void)photoViwerWilldealloc:(NSInteger)selecedImageViewIndex  {      NSLog(@"最后一张观看的图片的index是:%zd",selecedImageViewIndex);  }    - (UIImage *)compressImage:(UIImage *)image toMaxFileSize:(NSInteger)maxFileSize {      CGFloat compression = 0.9f;      CGFloat maxCompression = 0.1f;      NSData *imageData = UIImageJPEGRepresentation(image, compression);      while ([imageData length] > maxFileSize && compression > maxCompression) {          compression -= 0.1;          imageData = UIImageJPEGRepresentation(image, compression);      }        UIImage *compressedImage = [UIImage imageWithData:imageData];      return compressedImage;  }  //获得大图  - (NSArray*)getBigImageArrayWithALAssetArray:(NSArray*)ALAssetArray{      _bigImgDataArray = [NSMutableArray array];      NSMutableArray *bigImgArr = [NSMutableArray array];      for (ALAsset *set in ALAssetArray) {          [bigImgArr addObject:[self getBigIamgeWithALAsset:set]];      }      _bigImageArray = bigImgArr;      return _bigImageArray;  }  #pragma mark - 获得选中图片各个尺寸  - (NSArray*)getALAssetArray{      return _arrSelected;  }    - (NSArray*)getBigImageArray{        return [self getBigImageArrayWithALAssetArray:_arrSelected];  }    - (NSArray*)getSmallImageArray{      return _imageArray;  }    - (CGRect)getPickerViewFrame{      return self.pickerCollectionView.frame;  }      - (void)didReceiveMemoryWarning {      [super didReceiveMemoryWarning];      // Dispose of any resources that can be recreated.  }    /*  #pragma mark - Navigation    // In a storyboard-based application, you will often want to do a little preparation before navigation  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {      // Get the new view controller using [segue destinationViewController].      // Pass the selected object to the new view controller.  }  */    @end</code></pre>    <p>然后新建一个页面,继承base页面</p>    <pre>  <code class="language-objectivec">#import <UIKit/UIKit.h>  #import "HWPublishBaseController.h"    @interface EvaluateViewController : HWPublishBaseController    @end</code></pre>    <p>在这个.m页面自定义样式.用到上面我说的 [self initPickerView]和updatePickerViewFrameY这两个就基本完成样式设计.</p>    <pre>  <code class="language-objectivec">//  //  EvaluateViewController.m  //  PhotoSelector  //  //  Created by 洪雯 on 2017/1/12.  //  Copyright © 2017年 洪雯. All rights reserved.  //    #import "EvaluateViewController.h"  #import "BRPlaceholderTextView.h"  #import "UIImageView+WebCache.h"    #define iphone4 (CGSizeEqualToSize(CGSizeMake(320, 480), [UIScreen mainScreen].bounds.size))  #define iphone5 (CGSizeEqualToSize(CGSizeMake(320, 568), [UIScreen mainScreen].bounds.size))  #define iphone6 (CGSizeEqualToSize(CGSizeMake(375, 667), [UIScreen mainScreen].bounds.size))  #define iphone6plus (CGSizeEqualToSize(CGSizeMake(414, 736), [UIScreen mainScreen].bounds.size))  //默认最大输入字数为  kMaxTextCount  300  #define kMaxTextCount 300  #define HeightVC [UIScreen mainScreen].bounds.size.height//获取设备高度  #define WidthVC [UIScreen mainScreen].bounds.size.width//获取设备宽度    @interface EvaluateViewController ()<UIScrollViewDelegate,UITextViewDelegate>  {      float _TimeNUMX;      float _TimeNUMY;      int _FontSIZE;      float allViewHeight;      //备注文本View高度      float noteTextHeight;  }    /**   *  主视图-   */  @property (nonatomic, strong) UIScrollView *mianScrollView;  @property (nonatomic, strong) BRPlaceholderTextView *noteTextView;  //背景  @property (nonatomic, strong) UIView *noteTextBackgroudView;  //文字个数提示label  @property (nonatomic, strong) UILabel *textNumberLabel;  //图片  @property (nonatomic,strong) UIImageView *photoImageView;  //文字介绍  @property (nonatomic,copy) NSString *typeStr;  @property (nonatomic,copy) NSString *upPeople;  @property (nonatomic,copy) NSString *address;  @property (nonatomic,strong) UIView * lineVCThree;  @property (nonatomic,strong) UIButton * sureBtn;  @property (nonatomic,strong) NSMutableDictionary * upDic;  @property (nonatomic,strong) NSMutableArray * photoArr;  @property (nonatomic,copy)   NSString * photoStr;  @property (nonatomic,copy)   NSString * star_level;  @property (nonatomic,copy)   NSString * modelUrl;    @end    @implementation EvaluateViewController    - (void)viewDidLoad {      [super viewDidLoad];      // Do any additional setup after loading the view.      self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];      self.navigationItem.title = @"评价";        self.modelUrl = @"图片地址";      self.typeStr = @"类型";      self.upPeople = @"上传者";      self.address = @"地  址 : %@";        //收起键盘      UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped)];      tap.cancelsTouchesInView = NO;      [self.view addGestureRecognizer:tap];        self.star_level = @"1";        //监听键盘出现和消失      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];        _TimeNUMX = [self BackTimeNUMX];      _TimeNUMY = [self BackTimeNUMY];        [self createUI];  }    /**   *  取消输入   */  - (void)viewTapped{      [self.view endEditing:YES];  }  #pragma mark 键盘出现  -(void)keyboardWillShow:(NSNotification *)note  {      self.view.frame = CGRectMake(0, 0-200*_TimeNUMY, WidthVC,HeightVC);  }  #pragma mark 键盘消失  -(void)keyboardWillHide:(NSNotification *)note  {      self.view.frame = CGRectMake(0, 0, WidthVC, HeightVC);  }    - (void)createUI{      _mianScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, WidthVC, HeightVC)];      _mianScrollView.contentSize =CGSizeMake(WidthVC, HeightVC);      _mianScrollView.bounces =YES;      _mianScrollView.showsVerticalScrollIndicator = false;      _mianScrollView.backgroundColor = [UIColor groupTableViewBackgroundColor];      [self.view addSubview:_mianScrollView];      [_mianScrollView setDelegate:self];      self.showInView = _mianScrollView;        /** 初始化collectionView */      [self initPickerView];        [self initViews];  }    /**   *  初始化视图   */  - (void)initViews{      _noteTextBackgroudView = [[UIView alloc]init];      _noteTextBackgroudView.backgroundColor = [UIColor whiteColor];        ///照片      self.photoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(20*_TimeNUMX, 20*_TimeNUMY, 80*_TimeNUMX, 90*_TimeNUMY)];      [self.photoImageView sd_setImageWithURL:[NSURL URLWithString:self.modelUrl] placeholderImage:[UIImage imageNamed:@"plus"]];      UIButton * clickImageBtn = [[UIButton alloc] initWithFrame:CGRectMake(20*_TimeNUMX, 20*_TimeNUMY, 80*_TimeNUMX, 90*_TimeNUMY)];      [clickImageBtn addTarget:self action:@selector(ClickImage:) forControlEvents:UIControlEventTouchUpInside];      clickImageBtn.backgroundColor = [UIColor clearColor];        ///详情      NSArray * infoArr = @[self.typeStr,self.upPeople];      for (int i = 0; i<infoArr.count; i++) {          UILabel * infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(120*_TimeNUMX, 20*_TimeNUMY+30*_TimeNUMY*i, WidthVC-120*_TimeNUMX, 30*_TimeNUMY)];          infoLabel.text = infoArr[i];          infoLabel.font = [UIFont systemFontOfSize:14.0+_FontSIZE];          [_noteTextBackgroudView addSubview:infoLabel];      }      UILabel * info3Label = [[UILabel alloc] initWithFrame:CGRectMake(120*_TimeNUMX, 80*_TimeNUMY, WidthVC-120*_TimeNUMX, 40*_TimeNUMY)];      info3Label.numberOfLines = 0;      info3Label.text = self.address;      info3Label.font = [UIFont systemFontOfSize:14.0+_FontSIZE];      [_noteTextBackgroudView addSubview:info3Label];        UIView * lineVCOne = [[UIView alloc] initWithFrame:CGRectMake(0, 130*_TimeNUMY, WidthVC, 10*_TimeNUMY)];      lineVCOne.backgroundColor = [UIColor groupTableViewBackgroundColor];        UILabel * evaluateLabel = [[UILabel alloc] initWithFrame:CGRectMake(20*_TimeNUMX, lineVCOne.frame.origin.y+lineVCOne.frame.size.height+10*_TimeNUMY, 50*_TimeNUMX, 30*_TimeNUMY)];      evaluateLabel.text = @"总体";      evaluateLabel.font = [UIFont systemFontOfSize:14.0+_FontSIZE];        UIView * rView = [[UIView alloc]initWithFrame:CGRectMake(80*_TimeNUMX, lineVCOne.frame.origin.y+lineVCOne.frame.size.height+5*_TimeNUMY, 150*_TimeNUMX, 40*_TimeNUMY)];      //    rView.ratingType = INTEGER_TYPE;//整颗星      //    rView.delegate = self;        UIView * lineVCTwo = [[UIView alloc] initWithFrame:CGRectMake(0, evaluateLabel.frame.origin.y+evaluateLabel.frame.size.height+10*_TimeNUMY, WidthVC, 10*_TimeNUMY)];      lineVCTwo.backgroundColor = [UIColor groupTableViewBackgroundColor];        //文本输入框      _noteTextView = [[BRPlaceholderTextView alloc]init];      _noteTextView.keyboardType = UIKeyboardTypeDefault;      //文字样式      [_noteTextView setFont:[UIFont fontWithName:@"Heiti SC" size:15.5]];      _noteTextView.maxTextLength = kMaxTextCount;      [_noteTextView setTextColor:[UIColor blackColor]];      _noteTextView.delegate = self;      _noteTextView.font = [UIFont boldSystemFontOfSize:15.5];      _noteTextView.placeholder= @"    来分享您...";      self.noteTextView.returnKeyType = UIReturnKeyDone;      [self.noteTextView setPlaceholderColor:[UIColor lightGrayColor]];      [self.noteTextView setPlaceholderOpacity:1];      _noteTextView.textContainerInset = UIEdgeInsetsMake(5, 15, 5, 15);        _textNumberLabel = [[UILabel alloc]init];      _textNumberLabel.textAlignment = NSTextAlignmentRight;      _textNumberLabel.font = [UIFont boldSystemFontOfSize:12];      _textNumberLabel.textColor = [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1.0];      _textNumberLabel.backgroundColor = [UIColor whiteColor];      _textNumberLabel.text = [NSString stringWithFormat:@"0/%d    ",kMaxTextCount];        self.lineVCThree = [[UIView alloc] init];      self.lineVCThree.backgroundColor = [UIColor groupTableViewBackgroundColor];        //确定按钮      self.sureBtn = [[UIButton alloc] init];      self.sureBtn.backgroundColor = [UIColor orangeColor];      [self.sureBtn setTitle:@"确定" forState:UIControlStateNormal];      self.sureBtn.titleLabel.font = [UIFont systemFontOfSize:17.0+_FontSIZE];      [self.sureBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];      [self.sureBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];      self.sureBtn.layer.masksToBounds = YES;      self.sureBtn.layer.cornerRadius = 5.0;      [self.sureBtn addTarget:self action:@selector(ClickSureBtn:) forControlEvents:UIControlEventTouchUpInside];        [_mianScrollView addSubview:_noteTextBackgroudView];      [_mianScrollView addSubview:_noteTextView];      [_mianScrollView addSubview:_textNumberLabel];      [_mianScrollView addSubview:self.lineVCThree];      [_mianScrollView addSubview:self.sureBtn];        [_noteTextBackgroudView addSubview:self.photoImageView];      [_noteTextBackgroudView addSubview:clickImageBtn];      [_noteTextBackgroudView addSubview:lineVCOne];      [_noteTextBackgroudView addSubview:evaluateLabel];      [_noteTextBackgroudView addSubview:rView];      [_noteTextBackgroudView addSubview:lineVCTwo];        [self updateViewsFrame];    }    /**   *  界面布局 frame   */  - (void)updateViewsFrame{        if (!allViewHeight) {          allViewHeight = 0;      }      if (!noteTextHeight) {          noteTextHeight = 150*_TimeNUMY;      }        _noteTextBackgroudView.frame = CGRectMake(0, 0, WidthVC, 200*_TimeNUMY);        //文本编辑框      _noteTextView.frame = CGRectMake(0, _noteTextBackgroudView.frame.origin.y+_noteTextBackgroudView.frame.size.height+10*_TimeNUMY, WidthVC, noteTextHeight);        //文字个数提示Label      _textNumberLabel.frame = CGRectMake(0, _noteTextView.frame.origin.y + _noteTextView.frame.size.height-15*_TimeNUMY      , WidthVC-10*_TimeNUMX, 15*_TimeNUMY);        self.lineVCThree.frame = CGRectMake(0*_TimeNUMX,_noteTextView.frame.origin.y+_noteTextView.frame.size.height, WidthVC, 10*_TimeNUMY);        //photoPicker      [self updatePickerViewFrameY:self.lineVCThree.frame.origin.y + self.lineVCThree.frame.size.height];        self.sureBtn.frame = CGRectMake(20*_TimeNUMX, [self getPickerViewFrame].origin.y+[self getPickerViewFrame].size.height+30*_TimeNUMY, WidthVC-40*_TimeNUMX, 40*_TimeNUMY);        allViewHeight = self.sureBtn.frame.origin.y+self.sureBtn.frame.size.height+10*_TimeNUMY;        _mianScrollView.contentSize = self.mianScrollView.contentSize = CGSizeMake(0,allViewHeight);  }  /**   *  恢复原始界面布局   */  -(void)resumeOriginalFrame{      _noteTextBackgroudView.frame = CGRectMake(0, 0, WidthVC, 200*_TimeNUMY);      //文本编辑框      _noteTextView.frame = CGRectMake(0, 40*_TimeNUMY, WidthVC, noteTextHeight);        //文字个数提示Label      _textNumberLabel.frame = CGRectMake(0, _noteTextView.frame.origin.y + _noteTextView.frame.size.height-15*_TimeNUMY      , WidthVC-10*_TimeNUMX, 15*_TimeNUMY);  }    - (void)pickerViewFrameChanged{      [self updateViewsFrame];  }    #pragma mark - UITextViewDelegate  - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{      //当前输入字数      _textNumberLabel.text = [NSString stringWithFormat:@"%lu/%d    ",(unsigned long)_noteTextView.text.length,kMaxTextCount];      if (_noteTextView.text.length > kMaxTextCount) {          _textNumberLabel.textColor = [UIColor redColor];      }else{          _textNumberLabel.textColor = [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1.0];      }      if ([text isEqualToString:@"\n"]) {          [textView resignFirstResponder];      }      [self textChanged];      return YES;  }    //文本框每次输入文字都会调用  -> 更改文字个数提示框  - (void)textViewDidChangeSelection:(UITextView *)textView{      //      _textNumberLabel.text = [NSString stringWithFormat:@"%lu/%d    ",(unsigned long)_noteTextView.text.length,kMaxTextCount];      if (_noteTextView.text.length > kMaxTextCount) {          _textNumberLabel.textColor = [UIColor redColor];      }      else{          _textNumberLabel.textColor = [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1.0];      }      [self textChanged];  }    /**   *  文本高度自适应   */  -(void)textChanged{        CGRect orgRect = self.noteTextView.frame;//获取原始UITextView的frame        //获取尺寸      CGSize size = [self.noteTextView sizeThatFits:CGSizeMake(self.noteTextView.frame.size.width, MAXFLOAT)];        orgRect.size.height=size.height+10;//获取自适应文本内容高度          //如果文本框没字了恢复初始尺寸      if (orgRect.size.height > 100) {          noteTextHeight = orgRect.size.height;      }else{          noteTextHeight = 100;      }        [self updateViewsFrame];  }    #pragma mark - UIScrollViewDelegate  //用户向上偏移到顶端取消输入,增强用户体验  - (void)scrollViewDidScroll:(UIScrollView *)scrollView  {      if (scrollView.contentOffset.y < 0) {          [self.view endEditing:YES];      }  }    #pragma mark 点击出大图方法  - (void)ClickImage:(UIButton *)sender{    }    #pragma mark 确定评价的方法  - (void)ClickSureBtn:(UIButton *)sender{      if (self.noteTextView.text.length == 0 || self.noteTextView.text.length < 10) {          NSLog(@"您的评价描述字数不够哦!");            return;      }      if (self.noteTextView.text.length > kMaxTextCount) {          NSLog(@"您的评价描述字数太多了哦!");          return;      }        self.photoArr = [[NSMutableArray alloc] initWithArray:[self getBigImageArray]];        if (self.photoArr.count >9){          NSLog(@"最多上传9张照片!");        }else if (self.photoArr.count == 0){          NSLog(@"请上传照片!");        }else{          /** 上传的接口方法 */      }  }    #pragma mark 返回不同型号的机器的倍数值  - (float)BackTimeNUMX {      float numX = 0.0;      if (iphone4) {          numX = 320 / 375.0;          return numX;      }      if (iphone5) {          numX = 320 / 375.0;          return numX;      }      if (iphone6) {          return 1.0;      }      if (iphone6plus) {          numX = 414 / 375.0;          return numX;      }      return numX;  }  - (float)BackTimeNUMY {      float numY = 0.0;      if (iphone4) {          numY = 480 / 667.0;          _FontSIZE = -2;          return numY;      }      if (iphone5) {          numY = 568 / 667.0;          _FontSIZE = -2;          return numY;      }      if (iphone6) {          _FontSIZE = 0;          return 1.0;      }      if (iphone6plus) {          numY = 736 / 667.0;          _FontSIZE = 2;          return numY;      }      return numY;  }    - (void)didReceiveMemoryWarning {      [super didReceiveMemoryWarning];      // Dispose of any resources that can be recreated.  }    /*  #pragma mark - Navigation    // In a storyboard-based application, you will often want to do a little preparation before navigation  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {      // Get the new view controller using [segue destinationViewController].      // Pass the selected object to the new view controller.  }  */    @end</code></pre>    <p>最后的demo页面样式是这样的</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fc0449bab5c0f2dc041f0292dcf35b34.gif"></p>    <p style="text-align:center">Untitled.gif</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/cc710d0e6553</p>    <p> </p>