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