按钮透明度为0时不响应点击事件

将近半年多的时间,从产品到设计再到开发,现在我们的APP
终于进入了公测阶段,利用这段比较轻松的时间对APP中用到的一些技术和自己学到的一些技术做一个总结。

1、自定义Push和Pop动画,同时有侧滑效果

如图所示:


自定义Push和Pop动画
-(void)pushViewWithData:(NSDictionary *)data{
    
    UIViewController *popView = [[NSClassFromString(@"popViewController") alloc]init];
    SEL aSelector = NSSelectorFromString(@"setdata:");
    if ([popView respondsToSelector:aSelector]) {
        IMP aIMP = [popView methodForSelector:aSelector];
        void (*setter)(id, SEL, NSDictionary*) = (void(*)(id, SEL, NSDictionary*))aIMP;
        setter(popView, aSelector,data);
    }
    CATransition* transition = [CATransition animation];
    transition.duration = 0.35;
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromTop;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [self.navigationController pushViewController:popView animated:NO];
}
-(void)popAnimation{
    
    CATransition* transition = [CATransition animation];
    transition.duration = 0.35;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    transition.type = kCATransitionReveal;
    transition.subtype = kCATransitionFromBottom;
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [self.navigationController popViewControllerAnimated:NO];
}

具体代码可参考demo


2、animateWithDuration动画修改UIViewframe闪一下然后才有动画效果

解决方法:使用CGAffineTransform动画实现:

    [UIView animateWithDuration:3 delay:0.1 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        [weakSelf.heartbtn setTransform:CGAffineTransformMake(27.0 / 73.0, 0, 0, 27.0 / 73.0, -((ScreenW / 2) - 26.5), 23)];

 } completion:^(BOOL finished) {

}];
缩放效果

3、按钮透明度为0时不响应点击事件

UIButton透明度为0时,不响应点击事件,我以为是系统的问题,就采用了为'UIView'添加UITapGestureRecognizer事件,但是也出现了同样的问题,当UIView透明度为0时,也不响应点击事件了.个人推测,当UIButton透明度为0时,默认调用Hidden方法,所以不响应点击事件。可设置按钮Type可避免该问题

_heartbtn = [UIButton buttonWithType: UIButtonTypeCustom];
 [self.view addSubview:_heartbtn];

4、设置圆角

一般的,在开发中设置UIView的圆角,可直接设置cornerRadius属性,

       self.layer.cornerRadius = 10.f;

但是,在实际的开发中,APP设计师给出的一些View的圆角并不是四个角全部都是圆形,如下面的几张图,那么针对这种情况,就需要用系统为开发者提供的设置贝兹曲线圆角来实现。

You Send a SWEET

Timer
Toast
// MARK: - 设置顶部两个圆角
-(void)SettingSharaviewRound:(float)Round selfview:(UIView *)selfview
{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:selfview.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(Round, Round)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = selfview.bounds;
    maskLayer.path = maskPath.CGPath;
    selfview.layer.mask = maskLayer;
}

如果使用Masonry添加约束会导致用以上代码设置圆角不起作用,解决方案是在设置圆角之前调用父viewlayoutIfNeeded方法。

 [superView layoutIfNeeded];

5、通过Blocks来关联UIButton的点击事件

在开发中通常使用的按钮点击:

    UIButton *chatBtn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 44)];
    [self.view addSubview:chatBtn];
        [settingbtn mas_makeConstraints:^(MASConstraintMaker *make) {
            //距离顶部
            make.top.equalTo(weakSelf.mas_top).with.offset(20.f);
            //距离右边
            make.right.equalTo(weakSelf.mas_right).with.offset(-15.f);
            //设置大小
            make.size.mas_equalTo(CGSizeMake(50, 50));
        }];
    [chatBtn addTarget:self action:@selector(TouchChatBtn:) forControlEvents:UIControlEventTouchUpInside];

-(void)TouchChatBtn:(UIButton *)sender
{
  printf("\n================\n");
}

通过代码关联

#import <objc/runtime.h>

  void (^addTargetBlock)(void) = ^(void){
        
        printf("\n================\n");
    };
    objc_setAssociatedObject(chatBtn, &clickChatBtnType, addTargetBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
    
    
-(void)TouchChatBtn:(UIButton *)sender
{
    void(^addTargetBlock)(void) = objc_getAssociatedObject(sender, &clickChatBtnType);
    if(addTargetBlock)
    {
        addTargetBlock();
    }
}

进一步改进,通过给系统的UIButton添加一个分类来实现

#import <objc/runtime.h>

//===================================
//  UIButton 分类
//===================================

typedef void (^addTargetBlock)(void);

@interface UIButton (Category)

-(void)addTargetEvent:(UIControlEvents)EventType withTargetBlock:(addTargetBlock)TargetBlock;

@end
static const int block_key;
-(void)addTargetEvent:(UIControlEvents)EventType withTargetBlock:(addTargetBlock)TargetBlock
{
    objc_setAssociatedObject(self, &block_key, TargetBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(AddTargetBlocks:) forControlEvents:EventType];
}

-(void)AddTargetBlocks:(id)sender
{
    addTargetBlock block = (addTargetBlock)objc_getAssociatedObject(self, &block_key);
    if (block) {
        block();
    }
}

使用ReactiveObjC框架来监听按钮点击事件

使用时导入头文件#import "ReactiveObjC.h"

 //===========================
    [[_confirmBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        
        NSLog(@"=========================");

    }];

参考:iOS开发·runtime原理与实践: 关联对象篇

Effective Objective-C 2.0 第10条:在既有类中使用关联对象存放自定义数据


6、无动画先pop当前UIViewController,再push到下一个UIViewController

在一些需求中,从A界面Push到B界面,在从BPush到C,但是从C返回时直接返回到A界面,一般的Pop掉当前界面的同时再Push到一个新的界面会有一个动画效果,针对这种情况,采用的方法是当从B界面Push到C界面时,直接把B从栈中移除。

//获取跳转实例
  LTBaseViewController *InputNewPasswordView = [[NSClassFromString(@"InputNewPasswordViewController") alloc]init];

            // 获取当前路由的控制器数组
            NSMutableArray *vcArray = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
            // 获取档期控制器在路由的位置
            int index = (int)[vcArray indexOfObject:self];
            // 移除当前路由器
            [vcArray removeObjectAtIndex:index];
            // 添加新控制器
            [vcArray addObject: InputNewPasswordView];

            SEL aSelector = NSSelectorFromString(@"setReset_code:");
            if ([InputNewPasswordView respondsToSelector:aSelector]) {
                IMP aIMP = [InputNewPasswordView methodForSelector:aSelector];
                void (*setter)(id, SEL, NSString*) = (void(*)(id, SEL, NSString*))aIMP;
                setter(InputNewPasswordView, aSelector,@"1008611");
            }

            [self.navigationController setViewControllers:vcArray animated:YES];

7、Push的同时释放之前的内存

当用户被其他设备踢掉或者用户主动退出登录时,之前我的处理方式是,直接设置登录界面为windowrootViewController,同时清理本地数据库的数据,出现的问题是每次重新登录APP在手机中的使用内存就会多20+M,个人觉得这是由于我在没有释放掉当前ViewController内存所导致的,所以最终我的做法是:

(1)、之前的UIViewController已经没有用了,直接释放掉这些内存,跳转时采用popToViewController来实现;
(2)、干掉并释放掉单例的内存;
(3)、清理本地数据库的部分数据;
(4)、移除KVO监听;

跳转到登录界面,并释放掉栈中的内存

 //获取要跳转的界面
        UIViewController *LoginView = [[NSClassFromString(@"LoginViewController") alloc]init];
        // 获取navigationcontroller的栈
        NSMutableArray *navStack = [thisView.navigationController.childViewControllers mutableCopy];
        // 修改栈
        [navStack replaceObjectAtIndex:0 withObject:LoginView];
        // 重新设置navigation的栈
        [thisView.navigationController setViewControllers:navStack animated:YES];
        // 出栈并跳转至目标控制器(控制器和当前控制器之间的对象将全部释放)
        [thisView.navigationController popToViewController:LoginView animated:true];

释放Socket单例内存 移除KVO监听

// MARK: - 内存释放
-(void)ClearData
{
    [_socket disconnect];
    [_client removeObserver:self forKeyPath:@"status"];
    [_client removeObserver:self forKeyPath:@"loginState"];
    onceToken = 0;
    _client = nil;
}

8、导入PCH文件之后报错unknown type name 'NSString'

解决方法:在PCH文件中引用Foundation
#ifdef __OBJC__

#import <Foundation/Foundation.h>

#endif

9、通过Runtime+分类的方式实现UITextView的placeHolder占位文字

#import <objc/runtime.h>

@implementation UITextView (Category)

-(void)getplaceholder:(NSString *)placeholderString fontsize:(float)fontsize
{
    UILabel *placeholder = [[UILabel alloc] init];
    placeholder.text = placeholderString;
    placeholder.numberOfLines = 0;
    placeholder.textColor = [UIColor lightGrayColor];
    [placeholder sizeToFit];
    [self addSubview:placeholder];
    
    self.font = [UIFont systemFontOfSize:fontsize];
    placeholder.font = [UIFont systemFontOfSize:fontsize];
    
    [self setValue:placeholder forKey:@"_placeholderLabel"];
}

@end
#import "UITextView+Category.h"

 UITextView *inputTxt = [[UITextView alloc]init];
    [self.view addSubview:inputTxt];
    [inputTxt mas_makeConstraints:^(MASConstraintMaker *make) {
        //
        make.center.equalTo(weakSelf.view);
        //
        make.size.mas_equalTo(CGSizeMake(250, 120));
    }];
    inputTxt.layer.cornerRadius = 5.f;
    inputTxt.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [inputTxt getplaceholder:@"please input" fontsize:13.5];

效果如图所示

placeHolder占位文字


10、查看第三方相关Log日志

第一步:


Window-->Devices

第二步:


Download

第三步:
保存文件

第四步:


显示包内容

第五步:
Log日志文件

11、Application Loader stuck at “Authenticating with the iTunes store” when uploading an iOS app

参考Stack overflow

参考Apple Developer

按照里面的做法,执行命令行,修改DNS,开VPN,修改代理,然而并没有什么卵用,折腾到凌晨1点多,公司的网络实在太坑爹,最后手机开个热点,不到20秒,上传成功。


12、报错 Application tried to push a nil view controller on target

UIViewController *MySettingsView = [[NSClassFromString(@"MySettingsViewController") alloc]init];
  [self.navigationController pushViewController:MySettingsView animated:YES];

百度搜的是没有初始化storyboard对象造成的,但我的工程中并没有使用storyboard,是因为文件路径缺失造成的,解决方法:
Target —> Budild Phaes,导入报错的文件即可。


13、iOS 11之后系统没有导航栏时 WKWebView下移问题

     [(UIScrollView *)[[_webview subviews] objectAtIndex:0] setBounces:NO];
    _webview.scrollView.bounces = NO;
    _webview.scrollView.showsHorizontalScrollIndicator = NO;
    [_webview sizeToFit];
     if(isiPhoneXDevice){
        _webview.scrollView.contentInset = UIEdgeInsetsMake(-44,0,-44,0);
    }else{
        _webview.scrollView.contentInset = UIEdgeInsetsMake(-20,0,0,0);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容