iOS日常问题记录(实施更新)

1,465 阅读2分钟

1.UITextField类

1.UITextField属性设置(容易错过的属性)

1.1 设置UITextfield光标颜色

self.textfiled.tintColor = ColorRGB(255, 171, 52);

1.2 设置UITextfield文本向右偏移

self.textfiled.leftView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 10, 0)];
self.textfiled.leftViewMode = UITextFieldViewModeAlways;

1.3 自定义UITextfield清除按钮

 UIButton *cleanBtn = [self valueForKey:@"_clearButton"];
 [cleanBtn setImage:[UIImage imageNamed:@"edit_delete"] forState:UIControlStateNormal];

2.监听UITextfield的输入,监听UITextfield的输入

2.1 使用监听,不设置代理

监听:

[self.textfiled addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

方法实现:

- (void)textFieldDidChange:(UITextField *)textField {
    self.btn.enabled = textField.text.length==11;
}

2.2 需要设置代理,在代理方法中实现监听输入

- (void)textViewDidChange:(UITextView *)textView { // 在该代理方法中实现实时监听uitextview的输入
    if (textView.text.length>10) {
        [TipsTool showTipsOnView:self.view message:@"不能超过10"];
    }
    self.remindLab.text = [NSString stringWithFormat:@"%zd/10",textView.text.length];
    self.navigationItem.rightBarButtonItem.enabled = textView.text.length>0 && textView.text.length<=300;
}

2.UIView类

2.1 设置UIView的指定圆角

> 导入\#import <CoreGraphics/CoreGraphics.h>
  CGFloat radius = 20;
    UIRectCorner corner = UIRectCornerTopRight|UIRectCornerTopLeft; // 右上右左举例
    if (@available(iOS 11.0,*)) { // iOS11以上苹果提供了属性
        cornerRadiusView.layer.cornerRadius = radius;
        cornerRadiusView.layer.maskedCorners = (CACornerMask)corner;
    }else{ // iOS11已下用UIBezierPath设置
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:cornerRadiusView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
        maskLayer.frame = cornerRadiusView.bounds;
        maskLayer.path = path.CGPath;
        cornerRadiusView.layer.mask = maskLayer;
    }

3.UITableView类

3.1 tableview隐藏最后一行分割线

static void setLastCellSeperatorToLeft(UITableViewCell* cell)
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }

    if([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]){
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
}

4.UICollectionView类

4.1 控制collectionview头部随着cell滚动策略 但又让第二段头部悬浮置顶

 if (scrollView.contentOffset.y>头部偏移量) {
      self.layout.sectionHeadersPinToVisibleBounds = YES;
 }else{
      self.layout.sectionHeadersPinToVisibleBounds = NO;
 }

5.UIButton类

5.1 按钮内部文字太长省略号在中间的问题

设置这个属性就可以和label一样显示在后面
checkBtn.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;

6.其他

6.1 n位数添加单位处理

#pragma mark - 把大长串的数字做单位处理
- (NSString *)changeAsset:(NSString *)amountStr{

    if (amountStr && ![amountStr isEqualToString:@""]){
    
        NSInteger num = [amountStr integerValue];
        if (num<10000) {
            return amountStr;
        } else {
            NSString *str = [NSString stringWithFormat:@"%f",num/10000.0];
            NSRange range = [str rangeOfString:@"."];
            str = [str substringToIndex:range.location+2];
            if ([str hasSuffix:@".0"])
            {
                return [NSString stringWithFormat:@"%@万",[str substringToIndex:str.length-2]];
            }
            else
                return [NSString stringWithFormat:@"%@万",str];
        }
    }
    else
        return @"0";
}

6.2 iOS开发 -- iOS 14下popToRootViewControllerAnimated:YES 导致TabBar隐藏的问题

文章中的问题会出现在Xcode 12 + iOS 14上, 经过测试,

  • Xcode 11 + iOS14,

  • Xcode 12 + <= iOS 13

    (不会出此类问题.)

问题:

我们处理UITabbar在push的时候的显示和隐藏, 之前因该是如下的操作:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    } else {
        viewController.hidesBottomBarWhenPushed = NO;
    }
    [super pushViewController:viewController animated:animated];
}

这个在iOS 14之前是没问题的, 但是升级到iOS 14, 发现我们在执行 popToRootViewControllerAnimated:YES的时候, UITabBar隐藏了.

解决:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.viewControllers.count > 0) {
    	// 当前导航栏, 只有第一个viewController push的时候设置隐藏
        if (self.viewControllers.count == 1) {
            viewController.hidesBottomBarWhenPushed = YES;
        }
    } else {
        viewController.hidesBottomBarWhenPushed = NO;
    }
    [super pushViewController:viewController animated:animated];
}

6.3 WkWebView 解决加载内容文字很小的问题

解决:在WKWebview加载完毕后的didFinishNavigation 代理方法里加上

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    //执行JS方法获取导航栏标题
    [webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable title, NSError * _Nullable error) {
	        self.navigationItem.title = title;
    }];
    NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
    [self.wkWebView evaluateJavaScript:jScript completionHandler:nil];
    [self showLeftBarButtonItem];
    [_refreshControl endRefreshing];
}