iOS开发中经常遇到的一些问题

1.禁用UITextField的双击出现复制粘贴剪切等操作

有时候我们需要禁用UITextField的双击出现copy paste的功能,然而UITextField本身没有直接设置禁止用户复制粘贴剪切操作等方法,但是可以重载新建一个类继承UITextField,然后实canPerformAction方法,只需覆盖canPerformAction:withSender方法就可以,canPerformAction:withSender属于UIResponder类的

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (menuController) {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}

2. 如果想让同一个控件同时即改变位置的移动,又放大。这样设置是无效果的

self.btn.transform = CGAffineTransformMakeTranslation(0, 100);
self.btn.transform = CGAffineTransformMakeScale(1.5, 1.2);

这样操作是创建新的transform然后赋值,给按钮的transform,第二次赋值的会把之前赋值的给覆盖,所以会达不到想要的效果

解决办法:

<span style="color:#5c2699;">     self.btn.transform = CGAffineTransformMakeTranslation(0, 100);
    // 在之前的transform情况下,继续添加缩放的形变。
    self.btn.transform = CGAffineTransformScale(_btn.transform, 1.2, 1.2);</span>


3.将UIButton添加到UILabel,UIButton不能点击。
原因:
1.UILabel是继承UIView的,默认不能监听点击事件。UIButton是继承UIControl能够监听点击事件。

2.UIButton添加到UILabel,UILabel就是UIButton的父视图,父视图不能监听点击事件,自然不将事件传递给子视图,UIButton也不能监听点击事件了。

拓展:

因为我们一般在父类里实现的都是一些共用的属性和方法,而在子类中具体实现子类特有的方法。 

因此在UIControl实现了监听点击的特有方法,即继承UIControl才能监听点击事件。

4.XIB的使用技巧

Xib是用来描述视图长什么样子,一个项目中允许有很多xib,因此我们需要给xib绑定一个标识,即他View中对应的class是谁,就代表描述哪个class。

Xib中owner的class是用来告诉xib中的View需要调用哪个对象的方法,就填谁。比如需要调用dog类中的方法,就填dog。

注意:在连线选择上别连错了,

步骤一:先考虑自己是想给视图添加控件了还是想给视图添加事件

步骤二:添加控件就跟xib中的view连线。添加一些事件就给xib中的File’s Owner 连线。

5. UIToolBar问题
注意:
UIToolBar中不能使用 viewWithTag 方法, 获取 UIToolBar里的子视图。
UIToolBar里的子视图都是UIBarButtonItem,而UIBarButtonItem继承NSObject, 因此不能使用 viewWithTag 获取 UIToolBar里的子视图
- ( UIView *)viewWithTag:( NSInteger )tag的实现原理:
- (UIView *)viewWithTag:(NSInteger)tag
{
    
    // 1.如果当前tag和当前视图tag相同,直接返回
    if (self.tag == tag) return self;
    
    // 2.如果和当前视图tag不相同,遍历当前视图的所有子控件,查找对应的tag。
    for (UIView *view in self.subviews) {
        // 3.如果view不是UIView类或者UIView的子类直接返回nil
        if (![view isKindOfClass:[UIView class]]) return nil;
        if (tag == view.tag) {
            //  4. 返回有相匹配的视图
            return view;
        }
    }
    // 5.如果都没有找到,返回nil.
    return nil;
}

6.数据模型属性采用的策略中除了基本类型需要用assign,字符串需要用copy,其他对象类型都需要用strong。
Assign   对象销毁了,地址还在
Weak    对象销毁了,地址就为 nil  
Strong   都是对象,同一个地址,一变都变  
如果使用strong设置数值的时候,只是引用计数 +1 ,并不会建立新的副本  
Copy       不会跟着变  
网络模型为了避免不必要的麻烦,网络模型设置属性的时候,可以都使用copy

    7.返回的数组后面调用copy方法的原因

    1.可以建立一个不可变的数组,外界无法修改

    2.否则外面可以通过id或者其他的方法修改数组内容不够安全


    8.视图绘制方法注意点

    - (void)drawRect:(CGRect)rect;

    如果想要调用这个方法,必须视图在初始化的时候就设置尺寸,否则不会调用这个绘图方法

    这样不会调用

    <span style="white-space:pre">	</span>ZYHButton *view = [[ZYHButton alloc] init];

    必须在创建的时候就设置尺寸,如下:

    <span style="white-space:pre">	</span>ZYHButton *view = [[ZYHButton alloc] initWithFrame:CGRectMake(0, 0, 45, 25)];



    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 1
      评论
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值