iOS - 爬过的坑
2017-07-10 本文已影响524人
changsanjiang
- 长时间运行的线程可能需要新建额外的autoreleasepool来频繁的释放它的对象. 取决于实际代码表现, 适当调整和使用autoreleasepool.
- 如果子线程触发观察回调, 则回调也会在子线程中进行。
- 在使用U盟分享时,如果使用的 thumImage 链接地址无效,微信相关的分享服务无法打开。
- 在录制短视频的时候, 将输出文件的格式改成了.mp4导致录制有时候会失败。 后来看了苹果的sample, 将格式改为了.mov.
[self.dbMovieOutput startRecordingToOutputFileURL:self.kamera_movieOutURL recordingDelegate:self];
- (NSURL *)kamera_movieOutURL {
if ( _kamera_movieOutURL ) return _kamera_movieOutURL;
_kamera_movieOutURL = [self.kamera_movieFolderURL URLByAppendingPathComponent:@"db_kamera_movie.mov"];
return _kamera_movieOutURL;
}
- 同时安装了 Xcode8.3.3 和 Xcode9 在发布 podspec 时, 报如下错误:
-> SJVideoPlayerBackGR (1.0.0)
- ERROR | [iOS] unknown: Encountered an unknown error (/usr/bin/xcrun simctl list -j devices
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
) during validation.
解决办法:
终端输入: sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
- -ObjC 标志
这个标志与 Category 有关. 引用的静态库当存在分类时需要加上这个标志.
了解了一下这个标志的意思:
在引用静态库时, OC没有为每个方法定义链接符号,它只为每个类创建链接符号.
当在一个静态库中使用类别来扩展已有类时, 链接器不会把本类方法和 Category 中的方法整合起来.
所以当调用 Category 中的方法时, 出现"selector not recognized", 也就是找不到方法定义的错误. 为了解决这个问题, 引入了-ObjC标志, 它的作用就是将静态库中所有的和对象相关的文件都加载进来.
-
设置 shadowOffset
有时候设置shadowOffset不显示, 1是可能与父视图的层级关系有关. shadow被下一级的视图挡住了. 2 设置了clipsTopBounds. -
mac升级了系统, 用 pod 报错
/usr/local/bin/pod: /usr/local/Cellar/cocoapods/1.3.1/libexec/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
解决, 重装一下pod就好了:
gem install cocoapods
-
searchBar
WechatIMG85.jpeg
_searchBar.barTintColor = [UIColor whiteColor];
_searchBar.searchBarStyle = UISearchBarStyleMinimal;
设置bar透明:
[_searchBar setBackgroundImage:[UIImage new]];
- 为某个视图做
transform
动画, 出现卡顿.
原因是设置了阴影导致的. 加上self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
搞定.
全貌:
self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath;
self.view.layer.shadowOffset = CGSizeMake(-1, 0);
self.view.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.2].CGColor;
self.view.layer.shadowRadius = 1;
self.view.layer.shadowOpacity = 1;
- 父视图如何根据子视图自适应?
[_containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.offset(0);
make.leading.trailing.offset(0);
}];
[_subview mas_makeConstraints:^(MASConstraintMaker *make) {
make.edge.offset(0);
make.height.offset(50);
}];
- transform
/// a -> x 方向缩放
/// b -> y 拉伸
/// c -> x 拉伸
/// d -> y 方向缩放
/// tx -> x 平移
/// ty -> y 平移
/// 反转
_textView.transform = CGAffineTransformMake(1, 0, 0, -1, 0, 0);
- iOS 11 UITableView 调用
reloadData
后, 会抖动到别的地方. 解决办法:
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;
- iOS UITableViewHeaderFooterView 设置透明
view.backgroundColor = [UIColor clearColor];
view.backgroundView = [UIImageView new];
view.contentView.backgroundColor = [UIColor clearColor];
- 搜索控件可以使用定时器,当用户连续输入的时间超过一定时间时,就 开始一次搜索。这样使用延迟时间,就可以让用户在搜索前有足够的时间来输入想要 搜索的关键字。
- 上传版本时, 苹果发了一份邮件, 内容如下:
Dear Developer,
We identified one or more issues with a recent delivery for your app, "YourAppName". Please correct the following issues, then upload again.
Missing Info.plist key - This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSLocationWhenInUseUsageDescription key with a string value explaining to the user how the app uses this data.
坑爹啊, 定位没用啊 (可能有些第三方框架里面用到了定位服务, 但是我们App确实没有定位功能). 没办法, 第三方的还得用, 只能乖乖的把 key 加到 Info.plist 中去. 再次上传后成功.
- NSString的
UTF8String
这个方法返回的C字符串(生命周期不可控), 使用之前最好strcpy
一下. - UIPageViewController 报错如下:
Assertion failure in -[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:]
原因: 初始化时, 没有设置控制器(viewControllers 为空)
解决:
[self.pageViewController setViewControllers:@[[self _viewControllerWithIndex:0]]
direction:0
animated:NO
completion:nil];
- 使用
NSAssert(<#condition#>, <#desc, ...#>)
第一个参数有个坑, 请放bool变量 或 判断变量是否为空, 一定不要放执行语句. 在release模式下, NSAssert 是不执行的. - 删除远程tag 0.0.1
// 先删本地
git tag -d 0.0.1
// 再删远程
git push origin :0.0.1
- git403错误解决办法
git缓存了用户, 可以按下面步骤重新设置用户名和密码
// username 写要设置的用户名
git remote set-url origin https://username@github.com/changsanjiang/SJVideoPlayer.git
// 接着会提示输入密码
- 将protocols作为了一个subspec, 其中一个协议定义了一些通知如:
extern NSNotificationName const LWZMP3PlaybackControllerCurrentTimeDidChangeNotification;
, 在上层的文件中给出了定义, 发布podspec时, 死活验证不通过, 后来在当前文件夹中定义后, 发布成功.
image.png
# subspec
s.subspec 'Protocol' do |ss|
ss.source_files = 'LWZMP3Player/Protocol/*.{h,m}'
end
- 添加内购测试账号时我填自己的邮箱, 总是报错
发生了下列一个或多个验证错误
, 后来填了一个未注册的邮箱, 邀请成功了.
image.png - 控制器中, 懒加载方法中, 最好不要调用
self.view
.