一些UI设置总结

  1. 一个视图既要圆角又要阴影效果

    因为设置圆角需要设置maskToBounds为YES,而要设置阴影则maskToBounds为NO,二者不可兼得

    解决方法:

    • A为父视图,B为子视图,设置B与A的约束边距都为0;
    • 设置A的背景色为clearColor,设置A的阴影效果
    • 设置B的背景色为视图实际背景色,设置B的圆角

    另外发现一种更简单的方式:

    需要设置UIView.layer.masksToBounds = NO并且设置UIView.layer.borderWidth = CGFLOAT_MIN即可,某些自定义view在这样设置之后如果仍然无法实现,尝试下设置背景色即可。

  2. convertRect的正确使用

    示例代码:

    1
    CGRect rect = [self.loginLoanView convertRect:self.loginLoanView.selectBtn.frame toView:self.view];

    self.loginLoanView.selectBtnself.loginLoanView中的frame转化成selectBtn相对self.viewframe

    即 拿到self.loginLoanView中的selectBtn相对self.view的位置(x,y)和大小(width,height)

  3. xib视图获取子视图frame问题

    问题描述:

    controller的xib上拖拽一个子视图A,A上有个子视图B,添加约束,该controller被present出来后,获取B相对controller.view的frame,即:CGRect rect = [A convertRect:B.frame to:controller.view],如果拿到这个rect后,根据这个rect添加子视图到controller.view上显示的视图位置是不对的。

    解决方法:

    给子视图A另开一个xib,然后代码添加到controller.view上,即可。

  4. present通讯录列表页面,顶部title和取消按钮被状态栏遮挡问题

    问题描述:

    当前controller使用了全局变量来标记将要present的通讯录列表,第一次present后视图正常,再次present通讯录列表页的顶部不仅被遮挡,而且会展示controller的部分内容,非常错乱。

    解决方法:

    去掉全局变量,使用局部变量

  5. iOS12.1中,viewController.hidesBottomBarWhenPushed = YES,push某个页面后返回时,tabbar的显示会发生错乱。

    原因:UITabBar是磨砂的,在pushViewController时设置viewController.hidesBottomBarWhenPushed = YES时,tabbar内的按钮UITabBarButton被设置了错误的frameframe.size会变成(0,0)。

    解决方法:设置[UITabBar appearance].translucent = NO;将tabbar设置为非磨砂效果。

  6. 导航条图片渲染模式默认为default,得到的图片是蓝色的,可以直接设置图片属性render asOriginal,或者代码设置

    1
    childController.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];