ios 开发过程中遇到的问题(一)UITabBar隐藏、键盘隐藏、tap手势和UItavleView点击冲突、cell背景色覆盖按钮颜色

3 篇文章 0 订阅

1、关于UITabBar的隐藏

刚开始一直是使用 [self.tabBarController.tabBar setHidden:NO]; 对tabBar 进行隐藏的,这个代码在一般情况确实能实现隐藏的效果,但是什么情况下会有问题呢?

当控件(比如button)靠近屏幕底部的时候,无法触发事件,这个问题纠结了好久,也请教了许多前辈,后来我也上网差了些资料,终于,找到原因了. 就是tabBar 的隐藏问题导致的.虽然tabBar栏被隐藏了,但在隐藏的区域会成为一片空白区,无法被其他视图使用。这也就是为何button不响应时间的原因了.

解决办法:self.hidesBottomBarWhenPushed = YES; (但是要注意使用的时机,应该在视图push 前就设置隐藏,在pop 前设置为NO)


2、关于键盘遮挡输入框的问题

首先推荐个第三方 IQKeyboardManager

键盘遮挡有三种情况:

  • 输入框在view上面
  • 输入框在UITableView上面
  • 点击输入框键盘不需要出现

    针对第一种情况:

1.自定方法 ,用于移动视图

-(void)moveInputBarWithKeyboardHeight:(float)_CGRectHeight withDuration:(NSTimeInterval)_NSTimeInterval;

2.注册监听

NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];

    [defaultCenter selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    [defaultCenter addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

3.实现方法

- (void)keyboardWillShow:(NSNotification *)notification {

    NSDictionary *userInfo = [notification userInfo];

    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    CGRect keyboardRect = [aValue CGRectValue];

    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

    NSTimeInterval animationDuration;

    [animationDurationValue getValue:&animationDuration];

    if(nil==self.myTextView) return;//    self.editTextView 为被键盘遮挡住的控件

    CGRect rect = self.myTextView.frame;

    float textY = rect.origin.y + rect.size.height; 

    float bottomY = SCREENHEIGHT - textY;//得到下边框到底部的距离  SCREENHEIGHT 为当前设备的高度

    if(bottomY >=keyboardRect.size.height ){//键盘默认高度,如果大于此高度,则直接返回

        return;

    }

    float moveY = keyboardRect.size.height - bottomY;

    [self moveInputBarWithKeyboardHeight:moveY withDuration:animationDuration];

}



- (void)keyboardWillHide:(NSNotification *)notification {

    NSDictionary* userInfo = [notification userInfo];

    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

    NSTimeInterval animationDuration;

    [animationDurationValue getValue:&animationDuration];

    [self moveInputBarWithKeyboardHeight:0.0 withDuration:animationDuration];

}

 //根据相差的高度进行输入框的移动
-(void)moveInputBarWithKeyboardHeight:(float)_CGRectHeight withDuration:(NSTimeInterval)_NSTimeInterval{

  CGRect rect1 = self.view.frame;

    [UIView beginAnimations:nil context:NULL];

    [UIView setAnimationDuration:_NSTimeInterval];

    rect1.origin.y = -_CGRectHeight;//view往上移动

    self.view.frame = rect1;

    [UIView commitAnimations];

}

第二种情况,原理就是改变tableView的高度

_oY=_rightTableView.frame.size.height;//记录初始化的时候tableView 的高度

//键盘出现的时候

- (void)keyboardWillShow:(NSNotification *)notification {

    CGRect initialFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];    

    CGRect convertedFrame = [self.view convertRect:initialFrame fromView:nil];

    CGRect tvFrame = _rightTableView.frame;

    tvFrame.size.height = convertedFrame.origin.y;

    _rightTableView.frame = tvFrame;

}

 //隐藏键盘

- (void)keyboardWillHide:(NSNotification *)notification {

    CGRect tvFrame = _rightTableView.frame;

    tvFrame.size.height =_oY;    

    _rightTableView.frame = tvFrame;

}

第三种情况,点击UITextField的时候不需要弹出键盘,则只要在uitextField的代理方法- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    //    如果需要弹出键盘的话,返回yes,不需要的话返回NO;
    if (textField == _confirmField) {
        HGAlertViewController * alertViewController = [HGAlertViewController alertControllerWithTitle:@"提示" message:@"点击弹出对话框" preferredStyle:(UIAlertControllerStyleAlert)];
        alertViewController.addAction(@"确定",^(UIAlertAction *action){
            NSLog(@"点击了确定按钮");
        }).addAction(@"取消",^(UIAlertAction *action){
            NSLog(@"点击了取消按钮");
        });
        return NO;
    }else{
        return YES;
    }
}

3、处理弹窗中uitableView的点击事件和背景tap手势冲突

点击cell的时候,NSStringFromClass(touch.view)返回的是UITableViewCellContentView

OC类方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//    获取点击视图的类型
    NSString * touchClass = NSStringFromClass([touch.view class]);
//    判断点击视图的类型是不是UITableView的cell类型
    if ([touchClass isEqualToString:@"UITableViewCellContentView"]) {
//        如果是,返回false
        return false;
    }else{
//        如果不是返回true
        return true;
    }
}

swift类方法

//这是点击的代理协议,需要遵循UIGestureRecognizerDelegate,处理点击冲突问题
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    //获取点击视图类型的字符串
        let touchClass = NSStringFromClass((touch.view?.classForCoder)!)
        //判断点击视图是不是当前的弹框,如果不是,则表明点击的是背景隐藏弹框,如果是表明点击的UITableview的cell;
        //self.classForCoder返回的是uiview,touchClass也是返回uiview
        if touchClass != NSStringFromClass(self.classForCoder) {
            return false
        }
        return true
    }

说道这个问题,则引起另外一个问题:

ios 点击子视图的时候会响应父视图的点击事件

解决方法:

  • 让你的类继承 UIGestureRecognizerDelegate
  • tap.delegate = self;
  • 实现gestureRecognizer:shouldReceiveTouch:方法:

//Object-C:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:subView])  {
        return NO;
    }
    return YES;
} 

//Swift:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool  {
    if touch.view.isDescendantOfView(subView){
        return false
    }
    return true
}

4、Cell背景色覆盖按钮的颜色

cell默认选中行的颜色是灰色的,如果cell上有按钮等控件,会让自身的颜色被灰色覆盖

解决方法: 在自定义的cell中实现如下两个方法即可:

 -(void)setSelected:(BOOL)selected animated:(BOOL)animated {
     [super setSelected:selected animated:animated];
     被覆盖的控件名.backgroundColor = UIColor.redColor;
  }

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
     被覆盖的控件名.backgroundColor = UIColor.redColor;
 }
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

wode_weiyi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值