iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源6.iOS开发基础3-UIImage7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式12.iOS开发基础9-提示框(UIAlertController)13.iOS开发基础8-UIScrollView
14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View
15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别17.iOS开发基础28-数据存储与沙盒机制18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD55.iOS开发基础35-多线程之NSThread56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化在 iOS 开发中,掌握常用控件的定制化和高效使用技巧可以大大提高开发效率和代码质量。本文将详细介绍自定义构造方法、布局方法 layoutSubviews
、Xib 文件和通过 Xib 自定义 View 等关键技术,并深入分析其底层逻辑。
一、自定义构造方法
自定义构造方法可以让你通过更简洁、直观的方式来创建和初始化对象,尤其是在需要传递参数的情况下。
自定义构造方法示例
@interface NJShopView : UIView
@property(nonatomic, strong) NJShop *shop;
+ (instancetype)shopView;
- (instancetype)initWithShop:(NJShop *)shop;
+ (instancetype)shopViewWithShop:(NJShop *)shop;
@end
@implementation NJShopView
+ (instancetype)shopView {
return [[self alloc] init];
}
- (instancetype)initWithShop:(NJShop *)shop {
if (self = [super init]) {
self.shop = shop;
}
return self;
}
+ (instancetype)shopViewWithShop:(NJShop *)shop {
return [[self alloc] initWithShop:shop];
}
@end
为什么重写 initWithFrame
不仅要重写自定义的初始化方法,还应该重写 initWithFrame
方法,以便用户通过该方法创建 View 时,能够进行统一的初始化操作。
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"%s", __func__);
[self setupSubviews];
}
return self;
}
- (void)setupSubviews {
UIImageView *iv = [[UIImageView alloc] init];
iv.backgroundColor = [UIColor yellowColor];
[self addSubview:iv];
self.iv = iv;
UILabel *label = [[UILabel alloc] init];
label.backgroundColor = [UIColor purpleColor];
label.textAlignment = NSTextAlignmentCenter;
[self addSubview:label];
self.label = label;
}
底层逻辑分析
- 对象创建与初始化分离:
alloc
创建对象,init
完成对象初始化。 - 单一职责:不同的初始化方法可以针对不同场景完成更加灵活的初始化。
- 统一初始化逻辑:重写
initWithFrame
确保无论初始化方法如何调用,都能进行统一的初始化操作,减少代码重复。
二、layoutSubviews
layoutSubviews
方法是 UIView
的子视图布局方法,不仅可以确保子视图正确布局,还能响应尺寸变化等事件。
layoutSubviews 示例
- (void)layoutSubviews {
[super layoutSubviews];
NSLog(@"%s", __func__);
CGFloat shopViewWidth = self.frame.size.width;
CGFloat shopViewHeight = self.frame.size.height;
self.iv.frame = CGRectMake(0, 0, shopViewWidth, shopViewWidth);
self.label.frame = CGRectMake(0, shopViewWidth, shopViewWidth, shopViewHeight - self.iv.frame.size.height);
}
layoutSubviews 调用时机
- 控件创建时:创建一个控件就会调用
layoutSubviews
。 - 尺寸变化时:修改控件的尺寸(bounds/frame)时会调用该方法。
- 位置变化不调用:修改位置(center、frame.origin)不会调用。
- 尺寸无变化不调用:如果当前修改的尺寸和上一次的尺寸没有变化,不会调用。
底层逻辑分析
- 布局控制:通过
layoutSubviews
方法可以灵活地控制子视图位置和尺寸,确保其在各种情况下正确显示。 - 性能优化:
layoutSubviews
只在需要时调用,避免不必要的重绘,提高性能。 - 自动布局:通过自动布局调整子视图,适应各种屏幕尺寸和方向,提供良好的用户体验。
三、Xib 文件
Xib 文件是一种用来描述界面的文件格式,与 Storyboard 类似,但多用于描述较小或单独的界面组件。
什么是 Xib
- 简单或局部界面描述:用来描述一个简单的界面或者一个局部界面。
- Storyboard 前身:Xib 是 Storyboard 的前身,但仍在很多场景下使用,如自定义控件的设计和调试。
四、利用 Xib 自定义 View
使用 Xib 文件自定义 View 可以直观地设计界面并快速加载使用。
自定义 Xib View 示例
头文件定义
#import <UIKit/UIKit.h>
@class NJShop;
@interface XMGShopView : UIView
@property(nonatomic, strong) NJShop *shop;
+ (instancetype)shopView;
@end
实现文件
#import "XMGShopView.h"
#import "NJShop.h"
@interface XMGShopView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@end
@implementation XMGShopView
+ (instancetype)shopView {
return [[[NSBundle mainBundle] loadNibNamed:@"XMGShopView" owner:nil options:nil] firstObject];
}
- (void)setShop:(NJShop *)shop {
_shop = shop;
self.iconView.image = [UIImage imageNamed:_shop.icon];
self.nameLabel.text = _shop.name;
}
@end
Xib 文件加载原理
- 创建对象:根据 Xib 文件中的设置,创建自定义类对象。
- 设置属性:设置控件相关属性,如背景颜色、位置等。
- 创建子控件:创建并初始化所有子控件,设置其属性。
- 关联 Outlet:检查子控件是否有连线,如果有,则进行关联。
- 添加子控件:将所有子控件添加到父控件中,并形成协调工作。
底层逻辑分析
- 可视化设计:使用 Xib 可以更直观地进行界面设计,所见即所得。
- 解耦代码:通过 Xib 文件加载界面布局与代码实现进行分离,增强可维护性。
- 性能优化:Xib 文件只在需要时加载,避免不必要的内存占用,提高性能。
五、结论
通过对自定义构造方法、 layoutSubviews
、Xib 文件以及自定义 Xib View 的详细介绍,可以看到这些技术在 iOS 开发中的重要性与实用性。它们不仅提高了代码的可读性与可维护性,还保证了应用的性能与用户体验。
以下是学习重点和建议:
- 自定义构造方法:通过丰富的初始化方法提高对象创建的灵活性。
layoutSubviews
:灵活控制视图布局,响应尺寸变化,提高用户体验。- Xib 文件与自定义 View:通过可视化设计工具提高开发效率与可维护性。
通过掌握这些核心技术,开发者可以在 iOS 开发过程中游刃有余,写出更加高效和优雅的代码。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!