iOS AutoLayout: XIB 设置 CALayer 属性

ios-优雅的实现CALayer的"AutoLayout"的两种方案.zip 简单方便的间接实现CALayer的"AutoLayout" 立即下载

苹果的自动布局这套框架的确是好.

但是好的同时, 也给开发者带来了不小的挑战.
刚开始使用的时候, 还不如 Android 的 xml 布局好用, 虽然苹果多了可以拖拽的功能.

当你熟练使用后, 你会发现, 还真 TM 有那么回事.

之前有朋友私信问我, 平时在 iOS 开发中怎么书写 UI 布局的.

这里统一给出答复:

  1. 优先 AutoLayout.
  2. 其次 Masonry.
  3. 纯代码打造.

今天的任务

  1. 在 XIB 中给 UIView 添加几个 CALayer 相关的属性
  2. 在 XIB 中给 UIImageView 设置圆角

老规矩, 先看一下效果图.

1

在 CALayer.h 里面, 可以看到 Border 和 shadow 的属性定义.

/* The width of the layer's border, inset from the layer bounds. The
 * border is composited above the layer's content and sublayers and
 * includes the effects of the `cornerRadius' property. Defaults to
 * zero. Animatable. */

@property CGFloat borderWidth;

/* The color of the layer's border. Defaults to opaque black. Colors
 * created from tiled patterns are supported. Animatable. */

@property(nullable) CGColorRef borderColor;
/** Shadow properties. **/

/* The color of the shadow. Defaults to opaque black. Colors created
 * from patterns are currently NOT supported. Animatable. */

@property(nullable) CGColorRef shadowColor;

/* The opacity of the shadow. Defaults to 0. Specifying a value outside the
 * [0,1] range will give undefined results. Animatable. */

@property float shadowOpacity;

/* The shadow offset. Defaults to (0, -3). Animatable. */

@property CGSize shadowOffset;

/* The blur radius used to create the shadow. Defaults to 3. Animatable. */

@property CGFloat shadowRadius;

/* When non-null this path defines the outline used to construct the
 * layer's shadow instead of using the layer's composited alpha
 * channel. The path is rendered using the non-zero winding rule.
 * Specifying the path explicitly using this property will usually
 * improve rendering performance, as will sharing the same path
 * reference across multiple layers. Upon assignment the path is copied.
 * Defaults to null. Animatable. */

@property(nullable) CGPathRef shadowPath;

那么, 我们在 xib 中设置跟这两个相关的属性, 设置如下:

2

如果你的设置也像我一样, 那么 Run 一下吧!

我保证你看不到上面的效果(没有 Border 和 shadow 效果).

这个世界的牛人很多, 他们给出的解决方案就是重写 boderColor 和 shadowColor 这两个 property.

具体办法就是, 写个 CALayer 的 Category.

CALayer+MZXibConfig.h

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer (MZXibConfig)

- (void)setBorderColorXib:(UIColor *)color;

- (UIColor *)borderColorXib;

- (void)setShadowColorXib:(UIColor *)color;

- (UIColor *)shadowColorXib;

@end

CALayer+MZXibConfig.m

#import "CALayer+MZXibConfig.h"

@implementation CALayer (MZXibConfig)

// MARK: 设置 BorderColor

- (void)setBorderColorXib:(UIColor *)color
{
    self.borderColor = color.CGColor;
}

- (UIColor *)borderColorXib
{
    return [UIColor colorWithCGColor:self.borderColor];
}

// MARK: 设置 ShadowColor

- (void)setShadowColorXib:(UIColor *)color
{
    self.shadowColor = color.CGColor;
}

- (UIColor *)shadowColorXib
{
    return [UIColor colorWithCGColor:self.shadowColor];
}

@end

修改一下 xib 中设置的属性.

3

注意:
borderColor 改为了 borderColorXib
shadowColor 改为了 shadowColorXib

再 Run 一下, 你就能看到效果了.

这里还要提醒各位看官

shadowOpacity 一定要设置非0的值, 该值默认是0, 否则看不到 shadow 效果的. 别问我怎么知道, 看CALayer.h吧!

至于 UIImageView 设置圆角, 很简单了.

4

当你 Run 后,你发现然并卵!

我没有耍你, 是我们太年轻了.

好吧, 需要加个属性.

5

搞定!

写到这里, 本想收当睡觉, 但是怎么想那个 Category 的代码就是不美, 于是修改一下.

细心的读者可以发现, 上面那个 Category 头文件里面就是 set 和 get 的声明.

那我们是否可以简化一下代码?

使用强大的 property 属性.

那么, 问题来了

Category 中是不可以写成员变量的

那我们怎么可以这么做呢?

答案:

property 声明的属性, 编译器默认会声明set 和 get 方法.所以声明的不是成员变量, 而是成员方法.

使用 property 来声明CALayer+MZXibConfig.h

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer (MZXibConfig)

@property (nonatomic, weak) UIColor *borderColorXib;

@property (nonatomic, weak) UIColor *shadowColorXib;

@end

代码已经放在 github

DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目 简单介绍DASH的起源与发展、MPD文件简要解析、相关项目,以及常见流媒体协议的比较 阅读详情

相关推荐

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8426

在xib和storyBoard上设置layer属性的两种方法

xib和storyBoard在开发时给我们提供了很大的方便, 我们不但能在上面设置界面相关的属性,以及部分类的设置。 在开发时,我们很多时候都是实用代码对控件的layer层进行设置和修改,如果子类控件多了,每个都需要设置是不是很麻烦呢? 那么, 我们能不能向对view一样在xib上或者storyBoard上直接就能对layer进行相关设置呢?  答案当然是肯定的。 我们有两种方法

Yashon 6448

Kinect V1结构光激光散斑原理及样式

   对 intel realsense F200 和 Kinect V1的coding pattern原理进行调研,知二者都使用light coding的方式,该方法与传统的coded structure light不同:传统编码结构光(空间编码,时间编码)最终使用的是三角测量的原理计算深度信息;light coding通过投射具有高度伪随机性的激光散斑,会随着不同距离变换不同

松间明月 1万+

ios中如何使用xib自定义属性

今天没事的时候研究一下xib, 发现xib有些不知道的功能, 所以记录下来, 等以后用到了,在回味一下. 直接上代码截图 这里主要是介绍的是  使用Identity inspector中的User Defined Runtime Attributes(用户自定义运行时属性)在view上设置自定义属性, 在这里定义的属性在和代码一样, 在编辑的时候是无法显示的, 就像他的名字一样, 只有运行的

litianpeng0624的专栏 2526

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 285

proteus仿真51单片机操作指南:串口通信仿真配置详解

深入讲解如何在proteus仿真51单片机中实现串口通信,涵盖虚拟串口设置、电路连接与调试技巧,帮助开发者高效完成通信仿真验证。

weixin_36197669的博客 573

如何在Xib中添加自定义的属性?

很多时候Xib中给我们提供的属性根本不够用,用代码实现的话又有些繁杂,所以把你经常用到的属性添加到Xib中可以提高你的工作效率。

丫头的博客 860

百条网络工程师基础面试题(不断更新)

1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。它还处理带宽管理和各种通道。 4)什么是 LAN? LAN 是局域网的缩写。它是指计算机与位于小物理位置的其他网络设备之间的连接。 5)什么是节点? 节点是指连接发生的点。它可以是作为网络一部分的计算机

weixin_42728126的博客 2万+

iOS Xib 设置控件的圆角和边框

如下图:找到xib工具别表里的User Defind RunTime Attributes,点击“+”添加属性。,(这里注意:UIButton、UIView、UIImageView可以不写这句,但是Lbale一定要写), Type为String或者Number都可以。,Type为String或者Number都可以。,Type为Color类型。

wyz670083956的博客 4901

通达信浮筹多空波段抓牛擒龙指标公式源码

VAR33:=VA3>=REF(VA4,1) AND C<REF(C,1) AND VAR19=60 AND VAR18=0 AND 活跃线>=REF(活跃线,1) AND VA12<REF(VA13,1);DRAWTEXT(VAR28 AND COUNT(VAR28,30)=1,65,' ★超涨注意风险'),COLOR0000FF;DRAWTEXT(VAR26 AND COUNT(VAR26,30)=1,90,' ←继续等'),COLOR00FFFF;浮筹线:VA3,COLORFF00FF;

2401_86043146的博客 5278

别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)

本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。

weixin_42699679的博客 475

优雅的实现CALayer的"AutoLayout"的两种方案

前言 大家都知道UIView支持AutoLayout,而CALayer不可以。这是因为UIView负责事件响应、布局信息存储等,而CALayer主要负责页面内容展示。UIView和CALayer的关系,颇有一点**“我负责赚钱养家,你负责貌美如花”**的感觉。关于它们更全面的比较,可以参考详解CALayer 和 UIView的区别和联系 但是,有时候使用CALayer的时候,需要根据父视图、获取依...

weixin_33963594的博客 228

华为昇腾(Ascend)开发考试原题目解析 (2024) (题库一)——HCIP-AI-Ascend Developer——第一部分

给出一段代码如下,以下哪个选项描述错误?...A.中的语句由 MindSpore 接管,有语法限制B. 算子在中定义,并用来建立网络C.__init__()中的语句由 Python 解析执行D. 网络定义必须继承基类nn.Cell正确答案: B__init__()用于定义算子和网络层。所有需要用到的层(如卷积层、全连接层等)都应该在这里进行实例化。这部分代码由Python解释器执行。用于构建前向计算图。它调用在__init__()中定义好的算子和层来描述数据的流向。

qq_38334677的博客 1054

ios开发日记 -16 Xcode6快捷键、小技巧与xib圆角设置

以下都是使用Xcode6的一些记录,比较杂,不定期持续更新…… 快捷键: 1、StoryBoard技巧 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然后在你想选择的元素上点击鼠标,会弹出一个窗口,上面罗列了鼠标点击的位置下所有存在的元素,然后你再去进行选择会变的异常的简单。 2...

weixin_34233679的博客 82

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

如何设计一个 iOS 控件?(iOS 控件完全解析)

前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内;而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常

Lw_Chen的博客 589

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IOS如何给VIEW设置2个圆角?set cornerRadius for only top-left and top-right corner of a UIVIEW

-----如果大家有更好的方法请告诉我,谢谢-------- 有些设计中,需要实现top-left和top-right为圆角,而bottom-left and bottom-right依然是平角,这样就不能使用 _bg.layer.cornerRadius 了。 这里要用到一些基本的绘制功能UIBezierPath and CAShapeLayer ----------- 这里

IROYCN的博客 4224

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深入理解IOS布局和view加载显示

前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内;而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常特征之间需要...

weixin_30673715的博客 310

iOS如何提高页面流畅度

A.提高CPU性能 对象创建1.尽量用轻量的对象代替重量的对象,比如CALayer 比 UIView 要轻量许多,如果不考虑交互事件的话,可以选择CALayer。2.Storyboard和xib加载对象时,消耗的成本比代码多。在使用时需要综合考虑。3.使用对象的预加载和懒加载,减少使用时加载的负担。 对象调整1.UIView 的关于显示相关的属性(比如 frame/bounds/transfo...

weixin_30702887的博客 147

如何设计一个 iOS 控件?(iOS 控件完全解析) (转)

前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内;而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常特征之间需要...

weixin_30435261的博客 247

IOS面试问题总结

通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题: 1.搞清楚touch事件的传递(事件的响应链) 事件的响应(responder chain) 只有继承了UIResponder的类才能响应touch事件,从上图的响应者链可以看出,优先是最上层的view响应事件,如果该view有视图控制器的话会是下一个响应者,否者就是该view的父视图,这样至上而下传递...

weixin_30237281的博客 86

iOS 实现时间线列表效果

iOS 实现时间线列表效果

qq_33777090的博客 737

用drawRect的方式实现一个尺子

用drawRect的方式实现了一个尺子选择器,demo在这里:https://github.com/Phelthas/LXMRulerView 效果如图: 如果不考虑复用的问题,我感觉最简单的实现方式其实是让美术做一张尺子的图片,放到scrollView上就可以了, 数值可以根据scrollview的contentOffset来计算。 如果考虑复用的问题,还是用代码写来的方便...

weixin_30649859的博客 102

iOS 面试总结

面试题 基础篇 面向对象的三大特征 内存管理 Block GCD KVO KVC 推送通知 ⚠iOS7 iOS8差异 CALayer / UIView的关系 数据持久化 适配问题 iOS版本差异举例...

154

iOS视图成像理论及性能优化

iOS不是一蹴而就的,其中参杂了无数先驱的心血与智慧。在我们享受着iPhone的便捷时,其实我们忽略了很多细节,视图成像就是这样

Anglemiku_v 1327

Xcode 升级后,常常遇到的遇到的警告、错误,解决方法

从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了。 1,警告:“xoxoxoxo”  is deprecated 解决办法:查看xoxoxoxo的这个方法的文档,替换掉这个方法即可。 2,警告:Declaration of "struct sockaddr" will not be visible outside of this function

天涯狂子的博客 959
上一篇: iOS UI 技巧: 视图无法被点击
下一篇: iOS AutoLayout: 从 XIB 中加载 UIViewController
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值