四天成功叁个简便iOS App – 第四天

然后弹出键盘,此时在键盘通知中拿到键盘高度,弹出键盘会遮挡输入框,下边我们选择第二种方式来实现我们的需求,block会对控制器产生强引用,所以block中需要使用弱引用,在这里记录一下解决办法

金沙澳门官网7817网址 4
//输入框在屏幕外面UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, MainH, MainW,40)];textView.backgroundColor = [UIColor redColor];[self.view addSubview:textView];self.textView = textView;

前言

不久前涉企了三个招聘类app的付出,注册流程相当多,基本都是cell带输入框的表单列表样式,幸免不了的就能遇见键盘遮挡难点。相信大家也迟早蒙受过类似的难题,后日在此处就给我们分享一下,那些主题材料的消除思路。

第八日任务

  1. 推荐标签页面包车型地铁做到
  2. 圆形头像的安装和包裹
  3. 评价分界面包车型客车完成
  4. 新帖分界面包车型地铁成功
  5. 公告分界面包车型客车到位

当键盘弹出时让input标签事情要害

  • 让input失去大旨,收起键盘,在前边要填写失去宗旨的名号
    括号中填入的是包住input标签的div class,将input 也写上

 $('.recomd-man input').blur()

在cell的点击事件中,获取cell的可观与坐标,计算此时cell距0的尺寸,然后弹出键盘

金沙澳门官网7817网址 1

推荐标签页面包车型客车成功

点击卓越页面左上角开关来到推荐标签分界面。

推荐介绍标签分界面

推荐介绍标签的贯彻有了事先的阅历就非常容易了,依照MVC原则创设文件,同样在cell中增进模型属性,根据模型为cell内部调节件赋值。
独一有二个注意点:当点击步入推荐介绍标签页面,假设此刻数据还平素不博获得,点击重临,SVP的提示还在,block会对调整器产生强引用,纵然block还未曾执行完,调整器是不会死的,block试行实现之后,强引用才会被放大,调节器才会被灭绝,所以block中要求动用弱援用__weak typeof(self) weakSelf = self;,可是固然选择弱援用,调整器在该被灭绝的时候就能够被销毁,不过block内的代码照旧会继续推行的,只然而weakSelf会被置为nil,所以大家供给在一些击重临的时候将呼吁撤废,在-(void)viewWillDisappear:(BOOL)animated当调控器view将在消失的时候
遮掩SVP
而且打消乞求,可是AFN中要是正在发送央浼当呼吁还尚未重回的时候,撤消诉求会过来failure方法中,所以必要在failure方法中进行判断if (error.code == NSURLErrorCancelled),借使是亟需乞请的那么直接重临就能够,假使是伸手战败,则提醒用户。

只是倘要是跻身下二个分界面,则不供给撤除须求

总计文字的惊人,打开收起

  • 在工作中平时遇到那类的须求,要求总结文字的莫大,当到达几行之后就显得张开收起的按键,供文字实行收起。在未到达的时候不呈现此按键。
    思路在有多少的时候先总括文字的惊人,假如赶上设置的惊人展现打开收起的按键,未有就不彰显展开收起的开关.

<template>
<div class="des-bd">
          <div class="prd-info">
            <h5>{{ $t("message.productionInfo") }}</h5>
            <div class="more-desc" v-show="showMoreDesc" @click="moreDesc">
              <li class="pull-icon"></li>
            </div>
          </div>
          <div class="text-des">
             <pre class="des-ele" v-html="dealDes(prdInfo.description)"></pre>
          </div>
        </div>
</template>
<script>
dealDes (html) {
        // 设定产品高度为 100rem
        const rem = parseFloat($('html').css('font-size'))
        const minHeight = 100 / 75 * rem
        const ele = $('.des-ele').clone()
        const eleContainer = $('.text-des')

        ele.html(html)
        ele.css({
          position: 'absolute',
          top: 0,
          left: 0,
          opacity: 0
        })

        eleContainer.append(ele)
        const desEleHeight = ele.height() // rem2px
        ele.remove()

        if (desEleHeight > minHeight) {
          eleContainer.addClass('hide')
          this.showMoreDesc = true
        }

        return html
      }

moreDesc () {
        $('.text-des').toggleClass('hide')
        $('.pull-icon').toggleClass('transform-pull')
      }
</script>

还应该有其余键盘退出,滑动到底层弹出的有的小bug能够依赖要求协和改。注:点击cell的button弹出思路同样,修改了一些荒谬。demo地址:

贯彻方案

我们先来分析一下那么些须求,首先,这几个表单是四个列表list(UITableView大概UICollectionView),如图1所示,当客商点击输入框1、2、3、4、5的时候,弹出键盘但不会被挡住,这种处境,不用做拍卖,当顾客点击输入框6、7、8,弹出键盘会掩盖输入框,想要让输入框呈现出来,我们有四个格局,第一能够发展修改总体列表view的frame的y值,第二得以修改列表的contentoffset的y值,都得以达到规定的规范效果,上边大家选拔第二种格局来落到实处我们的必要。

切实贯彻分以下几步:

  1. 监听键盘弹起和吸取事件
  2. 计算键盘中度
  3. 测算contentoffset的y值要转移的差值并修改contentoffset的值
  4. 滑动列表时收起键盘
  5. 键盘收起时还原contentoffset的值

金沙澳门官网7817网址 2图1

上边一同来因而代码实现那些5步第一步__设置监听

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillShowNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillHideNotification object:nil];

第二步__计量中度

// 键盘监听事件- keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //键盘高度 CGFloat height = [value CGRectValue].size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) { //键盘弹起时 } else { //键盘收起时 } }

金沙澳门官网7817网址,第三步__总结contentoffset的y值要转移的差值并修改contentoffset的值
大家以点击第7个输入框为例,当点击第7个输入框的时候,咱们想要的成效是让第7个输入框跑到键盘下面,如图2所示

金沙澳门官网7817网址 3图2

那就是说这里大家将在计算一下亟需升高移动的距离delta=3-,2是list的可观,1是键盘的冲天,3是第7个输入框所在cell的maxY值-当前list的contentoffset的y值,如图3,

金沙澳门官网7817网址 4图3

1和2大家很好收获,重视是获取3的值,我们假诺取获得第7个输入框所在cell的实例,然后经过CGRectGet马克斯Y(cell.frame)就可以获得此值。上面是取获得cell实例的代码

- (UICollectionViewCell *)firstResponderCell { __block UICollectionViewCell *cell = nil; [self.collectionView.visibleCells enumerateObjectsUsingBlock:^(__kindof UICollectionViewCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { UICollectionViewCell *visibleCell = obj; //焦点所在的textField if (visibleCell.textField.isFirstResponder) { cell = visibleCell; } }]; return cell;}

计量差值改造contentoffset

// 键盘监听事件- keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //键盘高度 CGFloat keyboardHeight = [value CGRectValue].size.height; //列表的高度 CGFloat collectionViewHeight = self.collectionView.frame.size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) { //键盘弹出时 //获取输入框焦点所在的cell UICollectionViewCell *cell = [self firstResponderCell]; if  { //cell的maxY值 CGFloat cellMaxY = CGRectGetMaxY(cell.frame)- self.collectionView.contentOffset.y; //差值 = 3 - if (cellMaxY > collectionViewHeight-keyboardHeight) { //记录delta值,键盘收起恢复原来位置时使用 self.delta = cellMaxY-(collectionViewHeight-keyboardHeight); self.collectionView.contentOffset = CGPointMake(0, self.collectionView.contentOffset.y+self.delta); } } } else { //键盘收起时 } }

第四步__滑动列表时收起键盘

- scrollViewWillBeginDragging:(UIScrollView *)scrollView { UICollectionViewCell *cell = [self firstResponderCell]; if  { [cell.textField resignFirstResponder]; }}

第五步__键盘收起时还原contentoffset的值

 // 键盘监听事件- keyboardAction:(NSNotification*)sender{ NSDictionary *useInfo = [sender userInfo]; NSValue *value = [useInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; //键盘高度 CGFloat keyboardHeight = [value CGRectValue].size.height; //列表的高度 CGFloat collectionViewHeight = self.collectionView.frame.size.height; if ([sender.name isEqualToString:UIKeyboardWillShowNotification]) { //键盘出现时 } else { //键盘收起时 //根据self.delta复原 self.collectionView.contentOffset = CGPointMake(0, self.collectionView.contentOffset.y-self.delta); self.delta = 0 }}

实现得了,怎么着,是还是不是很简短~

新帖模块的完成

新帖模块页面和精髓一模二样,只是须求的多少不一致,只供给让新帖的调控器承袭自精湛调整器,央浼数据的时候对调整器类型实行判别,依照分裂的调节器设置不一样的乞请参数就可以。

- (NSString *)aParam
{
    if (self.parentViewController.class == [CLNewViewController class]) {
        return @"newlist";
    }
    return @"list";
}

通过一张图来看一下经典模块和新帖模块的构造

经典模块和新帖模块的结构

累加单元格选中的颜色

  • 三个页面有多少个单元格cell,须要在点击有个别cell的时候增加背景选中颜色,注明选中的是以此单元格,
    在点击此cell的时候用jQuery增添样式。

 $('.subscribe-list').removeClass('active')
 $('.subscribe-list').eq(val).addClass('active')