Light's Blog

The best or nothing.

iOS知识小集-180723

| Comments

UITableView Delete Cell

调用deleteRowsAtIndexPaths:withRowAnimation:时界面出现诡异问题,删除一个cell之后无法继续删除下面的cell。
暂时解决办法是在数据源中删除对应数据后,直接reloadData而不再调用上述方法。

UITableViewCell高亮效果

重写-setHighlighted:animated:方法,当highlighted时改变背景颜色,非highlighted时通过动画修改回去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
  [super setHighlighted:highlighted animated:animated];
  [self xg_setHighlighted:highlighted animated:animated color:[UIColor lightGrayColor]];
}

- (void)xg_setHighlighted:(BOOL)highlighted animated:(BOOL)animated color:(UIColor *)highlightedColor{
  if (highlighted) {
    self.contentView.backgroundColor = highlightedColor;
  } else {
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
      self.contentView.backgroundColor = [UIColor whiteColor];
    } completion:nil];
  }
}

Attempt to present UIViewController on UIViewController whose view is not in the window hierarchy

viewDidLoad:时不能present viewController,改写为viewDidAppear:时进行操作。

iOS知识小集-180716

| Comments

UIScrollView+EmptyDataSet

当状态变化时才会触发;
当列表内无元素时才会显示。

Update CocoaPods

[sudo] gem install cocoapods

UITableViewCell左滑删除出现后,TableView编辑状态失效

UITableViewCell需要按规则初始化。

Masonry、Autolayout断点调试

1、添加symbolic break pointUIViewAlertForUnsatisfiableConstraints
2、添加actionpo [[UIWindow keyWindow] _autolayoutTrace]
3、修改出错界面背景颜色e id $myView = (id) 0x10a005a90e (void)[$myView setBackgroundColor:[UIColor blueColor]]。(0x10a005a90为问题界面地址)

添加pch文件

1、创建.pch文件,引入需要全局引入的头文件;
2、在Build SettingsPrefix Header添加pch文件路径$SRCROOT/工程名/pch文件名,并设置Precompile Prefix Header = YES
3、优点:全局导入头文件,不必重复导入;预编译头文件被缓存,提高编译速度;
4、缺点:非必要全局引入的头文件会带来麻烦;

iOS知识小集-180619

| Comments

清除UIWebView JavaScript缓存

[webView stringByEvaluatingJavaScriptFromString:@"localStorage.clear();"];

类似网易新闻下拉刷新后的展开动画

修改anchorPoint(1, 0.5)

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)spreadFromCenterAnimation{
  CGRect rectFrom = CGRectMake(kScreen_Width / 2, 300, 0, 60);
  CGRect rectTo = CGRectMake(0, 300, kScreen_Width, 60);
  self.testView = [[UIView alloc] initWithFrame:rectFrom];
  self.testView.backgroundColor = [UIColor blueColor];
  self.testView.layer.anchorPoint = CGPointMake(1, 0.5);
  [self.view addSubview:self.testView];
  [UIView animateWithDuration:1 animations:^{
    self.testView.frame = rectTo;
  } completion:^(BOOL finished) {
    self.testView.frame = rectFrom;
  }];
}

iOS知识小集-180522

| Comments

UITextView关闭输入修正

textView.autocorrectionType = UITextAutocorrectionTypeNo textFiled.autocorrectionType = UITextAutocorrectionTypeNo

NSDateFormatter

“yyyy-MM-dd HH:mm:ss”

UIGraphicsBeginImageContextWithOptions

传入opaque参数值为NO时可以创建透明的图层。

load方法、initialize方法

https://www.jianshu.com/p/872447c6dc3f

iOS知识小集-180514

| Comments

GradientButton

创建渐变背景颜色的Button,如果直接添加CAGradientLayer,会覆盖Button的Image,所以需要创建一张渐变颜色的图片设置为Button的backgroundImage。

UICollectionViewCell Select Effect

为UICollectionViewCell添加选中效果。
方法一:
重写Cell的-setSelected:方法,在这个方法中增加动画效果。
The selected state is toggled when the user lifts up from a highlighted cell. Override these methods to provide custom UI for a selected or highlighted state.
方法二:
在CollectionView回调方法-collectionView:didHighlightItemAtIndexPath:-collectionView:didUnhighlightItemAtIndexPath:中添加动画效果。
方法三:
为CollectionViewCell添加-performSelectAnimation方法展示选中的动画效果,当-collectionView:didSelectItemAtIndexPath:时调用该方法。

iOS知识小集-180507

| Comments

WXApi无法分享

原因:WXApi针对不同分享内容有各种限制因素,必须符合要求才能分享。实际运用中可能影响分享的主要因素是thumbData的大小。 WXMediaMessage thumbData大小不能超过32k

可以通过压缩图片来达到WXApi的要求。

添加proto文件至工程

  1. 把proto文件拖入工程目录中;
  2. Compile Sources 中添加对应proto文件,否则在link时会出现symbol(s) not found for architecture arm64错误,无法找到对应的.o文件;
  3. 编译获得proto对应的类文件。

iOS知识小集-180418

| Comments

UISlider 自定义thumb大小

需继承UISlider并重写- thumbRectForBounds:trackRect:value:方法。

1
2
3
4
5
6
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value{
  CGFloat customWidth = 20;
  CGFloat customHeight = 20;
  bounds = [super thumbRectForBounds:bounds trackRect:rect value:value];
  return CGRectMake(bounds.origin.x, bounds.origin.y, customWidth, customHeight);
}

iOS知识小集-180319

| Comments

Today Extension 研究

Layout

  1. self.view.frame是整个屏幕大小。

Life cycle

  1. 滑走后,会重新创建。

NEVPNManager

NEVPNManager是用来创建和管理VPN设置,并且处理VPN连接结果的。 每一个应用只允许创建一个VPA设置,所以NEVPNManager是一个单例。 由NEVPNManager创建的VPN称为私人VPN,在iOS和macOS上,非私人VPA的优先级高于私人VPN。 使用NEVPNManager需要com.apple.developer.networking.vpn.api entitlement,需要开启应用的Personal VPN权限。 在开启私人VPN前,必须从Network Extension preferences载入VPN设置,在修改VPN设置之后,必须写入Network Extension preferences。 NEVPNManager的对象是线程安全的。

#import <NetworkExtension/NEVPNManager.h>

NEVPNProtocol

NEVPNProtocol用来配置VPN。

NEVPNConnection

NEVPNConnection用来控制VPN连接。

iOS知识小集-180312

| Comments

embed pods frameworks error

rm -rf ~/Library/Developer/Xcode/DerivedData

armv7、armv7s、arm64、i386、x86_64指令集

armv7 | armv7s | arm64 是ARM处理器指令集; i386 | x86_64 是Intel处理器指令集。

设备相关 arm64: iPhone6s | iPhone5s | iPad Air armv7s:iPhone5 | iPhone5c | iPad4 armv7: iPhone4 | iPhone4s | iPad3

模拟器32位处理器:i386架构; 模拟器64位处理器:x86_64架构; 真机32位处理器:armv7或armv7架构; 真机64位处理器:arm64架构。

而编译出哪种指令集的包,将由 ArchitecturesValid Architectures(因此这个不能为空)的交集来确定。 Build Active Architecture Only 指定是否只对当前连接设备所支持的指令集编译。

Git拉取远程分支

git checkout -b branch_name remote_branch_name

Today Extension 研究

  1. self.view.frame是整个屏幕大小。
  2. 滑走后,会重新创建。

NEVPNManager

#import <NetworkExtension/NEVPNManager.h>

iOS知识小集-180129

| Comments

圆角动画与圆角定制

  UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
  view.backgroundColor = [UIColor redColor];
  view.layer.cornerRadius = 20;
  //  圆角定制
  view.layer.maskedCorners = kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
  [self.view addSubview:view];
  //  圆角动画
  [UIView animateWithDuration:0.5 animations:^{
    view.layer.cornerRadius = 0;
  }];

NSMutableAttributedString crash

- (void)testAttributedStringInitCrash
{
  NSString *nilStr = nil;
  NSAttributedString *attributedStr = [[NSAttributedString alloc] initWithString:nilStr];
}

Crash Log ~~~ Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘NSConcreteAttributedString initWithString:: nil value’ ~~~

- (void)testMutableAttributedStringInitCrash
{
  NSString *nilStr = nil;
  NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:nilStr];
}

Crash Log ~~~ Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘NSConcreteMutableAttributedString initWithString:: nil value’ ~~~

- (void)testMutableAttributedStringAddAttributeCrash
{
  NSString *nonnullStr = @"str";
  NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:nonnullStr];

  NSString *nilValue = nil;
  [attributedStr addAttribute:NSAttachmentAttributeName value:nilValue range:NSMakeRange(0, 1)];
}

Crash Log ~~~ Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘NSConcreteMutableAttributedString addAttribute:value:range:: nil value’ ~~~