zoukankan      html  css  js  c++  java
  • LLDB奇巧淫技

    打印视图层级

    这个相信很多人都会了,是ta是ta就是ta recursiveDescription

    用法大概就是如下

    1
    2
    3
    po [self.view recursiveDescription]

    po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]

    Expression大法

    本篇Blog基本会围绕这个命令展开,这个命令是一个神奇的命令。
    由于本人才疏学浅,并不知道该怎么介绍这个命令,只能一言以蔽之,他的功能是 执行一个表达式

    用这个命令基本上就可以玩出花了,普通的方法函数都可以在LLDB调用了。

    UI样式更新

    首先本人钟爱使用Xcode自带的Debug View Hierarchy功能,于是讲一下如何在该Debud过程中动态修改UI。

    简述一下过程就是:获取对象 -> 对对象调用方法(更改样式) -> 渲染

    1. 获取对象
      选中 需要修改的控件
      查看 右侧栏中的Object inspector,这里你能看到一个Address属性,有了这个可谓成功了一半,接下来就是coding。
      这里先假设这个Address0x7fcef0c19290
    2. 对对象调用方法(更改样式)
      比如说我想要改背景颜色,可以这样e (void)[0x7fcef0c19290 setBackgroundColor:[UIColor blueColor]]
      这是比较随意直接的一种写法,也可以一步一步写

      1
      2
      3
      4
      5
      e UIView * $myView = (UIView *)0x7fcef0c19290

      e $myView.backgroundColor = [UIColor yellowColor]
      //下面这句和上一句的意思一样,你懂得
      //e (void)[$myView setBackgroundColor:[UIColor yellowColor]]
    3. 渲染
      然后到这里,你会发现并没什么卵用,是的,还差最后一步,渲染。
      e (void)[CATransaction flush]
      邦邦,是不是可以看到背景颜色变掉了

    以上可以在第2步中玩出花来,就看你怎么玩了

    强行刷新约束

    于是我就要讲述一下我玩的恶趣味,能改背景颜色等基础样式觉得不过瘾,我就是想能改约束玩玩。

    首先很天真,把Masonry的代码直接打进去

    1
    2
    3大专栏  LLDB奇巧淫技span>
    e (void)[$view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@20);
    }];

    LLDB妥妥的告诉我诸如unrecognize、undefined等信息。

    于是好吧,我想用原生的约束方法总行了吧

    1
    e NSLayoutConstraint * $constraint = [NSLayoutConstraint constraintWithItem:$view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0f constant:100.0f]

    结果LLDB说我不认识NSLayoutAttributeHeight、NSLayoutRelationEqual,我次奥,好的算你横,我把枚举对应的数值查了出来。

    1
    e NSLayoutConstraint* $constraint = [NSLayoutConstraint constraintWithItem:$test attribute:8 relatedBy:0 toItem:nil attribute:8 multiplier:1 constant:80.0f]

    ok,这个约束变量总算是生成了,不容易,然后就是加约束了

    1
    e (void)[$view addConstraint:$constraint]

    好吧,加是加上去了,但是妥妥的约束冲突啊,本来就已经有一个高度约束了呀,于是继续
    获取原来的约束列表,然后新建变量指向原有的那个约束,删除之,搞定。

    1
    2
    3
    4
    po [$view constraints]
    e NSLayoutConstraint* $oldConstraint = (NSLayoutConstraint*)0x6080000b34a0
    e (void)[$test removeConstraint:$oldConstraint]
    e (void)[CATransaction flush]

    然后通过指向新约束的指针可以愉快的改constant

    1
    2
    e $constraint.constant = 20
    e (void)[CATransaction flush]

    当然如果你只是要修改约束,可以直接从新建一个变量指向[$view constraints]里的某个约束,然后愉快的修改,不用这么麻烦删掉原来的、创建新的、加上新约束,简直妈的智障

    吐槽

    这个代码提示几乎不支持啊,是我使用方式不对吗????

    引用

    ObjC 中国

  • 相关阅读:
    java设计模式9.备忘录模式、访问者模式、调停者模式
    java设计模式8.迭代子模式、责任链模式、命令模式
    java设计模式7.策略模式、模板方法模式、观察者模式
    java设计模式5.组合模式、门面模式、享元模式、桥接模式
    java设计模式4.适配器模式、装饰器模式
    第6章 事务管理 6.1 spring事务
    第8章 浏览器对象模型BOM 8.1 window对象
    关于Socket、TCP/IP、HTTP、FTP及网络编程
    GO.Web服务
    git clone 下载慢
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12327436.html
Copyright © 2011-2022 走看看