美文网首页程序员iOS Developer
iOS 11问题..持续更新

iOS 11问题..持续更新

作者: IT_机器猫 | 来源:发表于2017-09-11 17:22 被阅读134次

开发过程中的一些以前遇到的一些问题和新遇到的iOS11的问题,会持续更新,,后边会附上自己写的一些小工具,希望可以帮助到其他盆友们,顺便求打赏✧(≖ ◡ ≖✿)嘿嘿

0.0.jpg

iOS11

1.nav.title显示数字标题时,显示紊乱

在标题上边只显示的是数字,就不会正常显示,会遮挡.暂时没有太好的解决办法,我的处理方法就很简单:

UILabel *navTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 40)];
navTitleLabel.backgroundColor = [UIColor whiteColor];
navTitleLabel.font = [UIFont fontWithName:@"PingFangTC-Light" size:17];
navTitleLabel.textColor = [UIColor blackColor];
navTitleLabel.textAlignment = NSTextAlignmentCenter;
navTitleLabel.text = self.title;
self.navigationItem.titleView = navTitleLabel;

2.关于inputAccessoryView定制问题

iOS11已经不能定制inputAccessoryView了,我们以前会有这样一种用法:

self.testTF.inputView = self.pickerView//(UIPickerView);
self.testTF.inputAccessoryView = self.toolBar//(UIToolbar);

你会发现在iOS11上已经不能这么用了,会失效,暂时的解决办法只能自定义个view然后放置上UIPickerView再加俩button,抛出代理处理了.


普通问题

1.获取父视图控制器

- (UIViewController *)viewController
{
    for (UIView* next = [self superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
} 

2.解决cell顶格

-(void)viewDidLayoutSubviews
{
    if ([self.historySearch respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.historySearch setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
    }
   
    if ([self.historySearch respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.historySearch setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
    }
}
#pragma mark - UITableViewDelegate

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
   
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

3.报错:BuildRoot :6520

[UITableView _dequeueReusableViewOfType:withIdentifier:], /BuildRoot/Library/Caches/com.apple.xbs/So 6520
cell上边添加手势出错

4.报错:BuildRoot :6530

[UITableView _dequeueReusableViewOfType:withIdentifier:], /BuildRoot/Library/Caches/com.apple.xbs/So 6530
在可视化编程中view上多了一个不属于当前控制器的控件

5.iOS10跳转APP store (alivegallery)这个是固定字段

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://itunes.apple.com/cn/app/alivegallery/id******?mt=8"]];

6.修改状态栏颜色

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

方法不起作用:

  • 查看info文件中是否有View controller-based status bar appearance 设置的是NO 有的话把其删除
  • 删除完之后再重写一个自己的nav作为根nav
  • 然后重写nav中的上述方法,方法实现:
- (UIStatusBarStyle)preferredStatusBarStyle
{
    UIViewController* topVC = self.topViewController;
    return [topVC preferredStatusBarStyle];
}

//注意 设置完这个之后整个项目self.automaticallyAdjustsScrollViewInsets会默认为yes,注意布局

7.收回当前控制器成为第一响应者的view

- (void)viewResignFirstResponse:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isFirstResponder]) {
            [subview resignFirstResponder];
            return;
        }
        [self viewResignFirstResponse:subview];
    }

8.遇到引用库重复定义的问题.

  • 拉出.a文件,查看.a文件支持的框架(arm64/armv7/i386/x86_64)
    lipo -info ***.a
  • 分解出各个单独框架的.a文件(分解成not fat file 文件方便以后分离.o文件)
    lipo ***.a -thin armv7 -output ***_armv7.a (armv7例子)
  • 分解出各个.a文件的.o文件(最好单独创建一个文件夹)
    ar vx ***_armv7.a
  • 根据报错信息,删除各个单独.a文件中冲突的.o文件(举例)
    rm ********.o
  • 合并各个删除.o文件之后的单独框架 生成新的.a文件
    ````ar rcs ***_final_armv7.a *.o```
  • 其他单独框架重复以上操作生成各种新的.a文件
  • 生成新的.a文件
    lipo -create ***armv7.a ***arm64.a ***i386.a ***x_86_64.a -output ***new.a
  • 覆盖原工程中.a文件

9.解决在标签控制器上添加图片被系统背景覆盖问题

cinema.tabBarItem.image = [[UIImage imageNamed:@"cinema"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

后边附上我近些时候写的一个帮助类项目,算是一个在开发过程中使用到的小工具总结,有一些也是自己写的一个分类/扩展,希望对你们有帮助


项目目录:

分类&扩展

  • ViewControl
//回收当前键盘
- (void)viewResignFirstResponse:(UIView *)view;
  • View

获取各种坐标和frame的封装(引用自网络)

  • String
//获取字符串高度/宽度
- (CGFloat)boundingHeightWithWidth:(CGFloat)width withFont:(CGFloat)font;
- (CGFloat)boundingWidthWithHeight:(CGFloat)height withFont:(CGFloat)font;
//对象转json字符串
+ (NSString*)DataTOjsonString:(id)object;
//emoji表情封装(引用于网络)
NSString+Emoji
//数字和字母的集合
+ (Boolean)isNumberCharaterString:(NSString *)str;
//字母的集合
+ (Boolean)isCharaterString:(NSString *)str;
//数字组合
+ (Boolean)isNumberString:(NSString *)str;
//是否含有非法字符
+ (Boolean)hasillegalString:(NSString *)str;
//数字组合 +
+ (Boolean)isValidSmsString:(NSString *)str;
//邮箱
+ (BOOL) validateEmail:(NSString *)email;
//手机号码验证
+ (BOOL) validateMobile:(NSString *)mobile;
//车牌号验证
+ (BOOL) validateCarNo:(NSString *)carNo;
//车型
+ (BOOL) validateCarType:(NSString *)CarType;
//用户名
+ (BOOL) validateUserName:(NSString *)name;
//密码
+ (BOOL) validatePassword:(NSString *)passWord;
//昵称
+ (BOOL) validateNickname:(NSString *)nickname;
//身份证号
+ (BOOL) validateIdentityCard: (NSString *)identityCard;
//Urlencode转码
+ (NSString *)encodeToPercentEscapeString: (NSString *) input;
+ (NSString *)decodeString:(NSString*)encodedString;
  • Color
/* 从十六进制字符串获取颜色 */
+ (UIColor *)colorWithHexString:(NSString *)color;

/* 从十六进制字符串获取颜色 */
+ (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha;

/* 颜色转图片 */
+ (UIImage *)createImageWithColor:(UIColor *)color;
  • Date
//根据N年N月N日N时N分N秒生成日期 起始日期:0000-00-00 00:00:00 +0000
+ (NSDate *)dateWithYear:(NSInteger)year
                   month:(NSInteger)month
                     day:(NSInteger)day
                    hour:(NSInteger)hour
                  minute:(NSInteger)minute
                  second:(NSInteger)second;
//计算连个date之间差天数
+ (NSInteger)daysOffsetBetweenStartDate:(NSDate *)startDate endDate:(NSDate *)endDate;
//距今天之前N小时N分钟的日期
+ (NSDate *)dateWithHour:(int)hour
                  minute:(int)minute;

#pragma mark - Getter
- (NSInteger)year;//到今天有多少年
- (NSInteger)month;//到今天有多少月
- (NSInteger)day;//到今天有多少日
- (NSInteger)hour;//到今天有多少小时
- (NSInteger)minute;//到今天有多少分钟
- (NSInteger)second;//到今天有多少秒
- (NSString *)weekday;//今天是周几


#pragma mark - Time string
- (NSString *)timeHourMinute;//获取现在时间(14:05)
- (NSString *)timeHourMinuteWithPrefix;//获取现在时间(下午14:05)
- (NSString *)timeHourMinuteWithSuffix;//获取现在时间(pm14:05)
- (NSString *)timeHourMinuteWithPrefix:(BOOL)enablePrefix suffix:(BOOL)enableSuffix;

#pragma mark - Date String
- (NSString *)stringTime;//(14:05)
- (NSString *)stringMonthDay;//(08.25)
- (NSString *)stringYearMonthDay;//(2017-08-25)
- (NSString *)stringYearMonthDayHourMinuteSecond;//2017-08-25 14:05:30
+ (NSString *)stringYearMonthDayWithDate:(NSDate *)date;      //date为空时返回的是当前年月日 获取时间对象的年月日
+ (NSString *)stringLoacalDate;//获取当地时间

#pragma mark - Date formate
+ (NSString *)dateFormatString;//yyyy-MM-dd
+ (NSString *)timeFormatString;//HH:mm:ss
+ (NSString *)timestampFormatString;//yyyy-MM-dd HH:mm:ss
+ (NSString *)timestampFormatStringSubSeconds;//yyyy-MM-dd HH:mm

#pragma mark - Date adjust
- (NSDate *) dateByAddingDays: (NSInteger) dDays;//从调用日期几天之后的时间
- (NSDate *) dateBySubtractingDays: (NSInteger) dDays;//从调用日期几天之前的时间

#pragma mark - Relative dates from the date
+ (NSDate *) dateTomorrow;//明天日期
+ (NSDate *) dateYesterday;//昨天日期
+ (NSDate *) dateWithDaysFromNow: (NSInteger) days;//从今天起几天之后时间
+ (NSDate *) dateWithDaysBeforeNow: (NSInteger) days;//从今天起几天之前时间
+ (NSDate *) dateWithHoursFromNow: (NSInteger) dHours;//从今天起几小时之后时间
+ (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours;//从今天起几小时之前时间
+ (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes;//从今天起几分钟之后时间
+ (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes;//从今天起几分钟之前时间
+ (NSDate *) dateStandardFormatTimeZeroWithDate: (NSDate *) aDate;  //标准格式的零点日期
- (NSInteger) daysBetweenCurrentDateAndDate;                     //负数为过去,正数为未来

#pragma mark - Date compare
- (BOOL)isEqualToDateIgnoringTime: (NSDate *) aDate;//两个日期是否相等
- (NSString *)stringYearMonthDayCompareToday;//返回“今天”,“明天”,“昨天”,或年月日
+ (NSString *)intervalTimeFromDate:(NSDate *)date1 toDate:(NSDate *)date2;//返回 几秒前,几分前,几小时前,几天前,几月前,几年前
+ (NSString  *)displayDataStyleWithNumber:(NSString *)timeNumber;//通过时间戳 获取"刚刚""几分钟前""几小时前" "昨天 00:00:00" 本周内"周几" 超出本周"正常时间"
+ (NSString *)getTimeString:(NSInteger)duration; //通过时长获取时分秒的字符串  倒计时用
#pragma mark - Date and string convert
+ (NSDate *)dateFromString:(NSString *)string;//字符串转Date
+ (NSDate *)dateFromString:(NSString *)string withFormat:(NSString *)format;//根据格式把字符串转成Date
- (NSString *)string;//日期转字符串
- (NSString *)stringCutSeconds;//转成字符串 砍掉秒  2017-08-25 14:05

还有一些帮助类:比如base64,MD5加密,des3加密,自己写的一个金额输入框例:"0.01",包括自主判断和自定义键盘.一个无数据tabview(继承)等等...

附上github链接,欢迎使用


相关文章

网友评论

    本文标题:iOS 11问题..持续更新

    本文链接:https://www.haomeiwen.com/subject/eepfsxtx.html