iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View

在 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;
}

底层逻辑分析

  1. 对象创建与初始化分离alloc 创建对象, init 完成对象初始化。
  2. 单一职责:不同的初始化方法可以针对不同场景完成更加灵活的初始化。
  3. 统一初始化逻辑:重写 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 调用时机

  1. 控件创建时:创建一个控件就会调用 layoutSubviews
  2. 尺寸变化时:修改控件的尺寸(bounds/frame)时会调用该方法。
  3. 位置变化不调用:修改位置(center、frame.origin)不会调用。
  4. 尺寸无变化不调用:如果当前修改的尺寸和上一次的尺寸没有变化,不会调用。

底层逻辑分析

  1. 布局控制:通过 layoutSubviews 方法可以灵活地控制子视图位置和尺寸,确保其在各种情况下正确显示。
  2. 性能优化layoutSubviews 只在需要时调用,避免不必要的重绘,提高性能。
  3. 自动布局:通过自动布局调整子视图,适应各种屏幕尺寸和方向,提供良好的用户体验。

三、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 文件加载原理

  1. 创建对象:根据 Xib 文件中的设置,创建自定义类对象。
  2. 设置属性:设置控件相关属性,如背景颜色、位置等。
  3. 创建子控件:创建并初始化所有子控件,设置其属性。
  4. 关联 Outlet:检查子控件是否有连线,如果有,则进行关联。
  5. 添加子控件:将所有子控件添加到父控件中,并形成协调工作。

底层逻辑分析

  1. 可视化设计:使用 Xib 可以更直观地进行界面设计,所见即所得。
  2. 解耦代码:通过 Xib 文件加载界面布局与代码实现进行分离,增强可维护性。
  3. 性能优化:Xib 文件只在需要时加载,避免不必要的内存占用,提高性能。

五、结论

通过对自定义构造方法、 layoutSubviews 、Xib 文件以及自定义 Xib View 的详细介绍,可以看到这些技术在 iOS 开发中的重要性与实用性。它们不仅提高了代码的可读性与可维护性,还保证了应用的性能与用户体验。

以下是学习重点和建议:

  1. 自定义构造方法:通过丰富的初始化方法提高对象创建的灵活性。
  2. layoutSubviews:灵活控制视图布局,响应尺寸变化,提高用户体验。
  3. Xib 文件与自定义 View:通过可视化设计工具提高开发效率与可维护性。

通过掌握这些核心技术,开发者可以在 iOS 开发过程中游刃有余,写出更加高效和优雅的代码。

posted @ 2015-07-15 14:04  Mr.陳  阅读(732)  评论(0编辑  收藏  举报