iOS 开发可视化编程之 XIB

XIB 的全称是 “XML Interface Builder”。它是一种使用 XML 格式描述用户界面的文件格式,由苹果公司开发,用于在 Xcode 中创建和编辑 iOS 和 macOS 应用程序的用户界面。XIB 文件可以包含界面中的视图、控件、布局和约束等信息,可以方便地创建复杂的用户界面,同时也使得界面设计和代码实现分离,提高了开发效率。在运行时,XIB 文件会被解析成对象图,并与代码进行绑定,从而实现界面的显示和交互。

下面收集了一些 XIB 的教程:

XIB 常见问题

Add Constraints 按钮不可用

Xcode 移除了 XIB 的预览功能

是的,Xcode 14 移除了 XIB 的预览功能。

XIB 是 Interface Builder 的文件格式,用于在 Xcode 中创建用户界面。XIB 文件包含所有 UI 元素的布局和属性信息。

Xcode 14 中引入了新的 SwiftUI 视图构建器,它提供了一种更现代、更直观的方式来创建用户界面。SwiftUI 视图构建器使用 Swift 编程语言,而不是 XIB 文件。

由于 SwiftUI 视图构建器是新的,因此 Xcode 14 中移除了 XIB 的预览功能。这是为了让开发人员专注于学习和使用 SwiftUI 视图构建器。

如果您需要使用 XIB 文件,您仍然可以使用 Xcode 14 打开和编辑它们。但是,您将无法使用 Xcode 14 的预览功能查看 XIB 文件中的用户界面。

uikit - Xcode 中的多个设备预览选项 - 代码日志

加载 XIB 的生命周期

1
2
3
4
5
6
7
8
9
10
1. setFrame
CameraLiveView set frame {{0, 0}, {390, 220}}
2. awakeFromNib
CameraLiveView awakeFromNib frame {{0, 0}, {390, 220}} {{0, 0}, {390, 220}}(bounds)
3. layoutSubviews
CameraLiveView layoutSubviews frame {{0, 0}, {414, 232.66666666666666}}
4. layoutSubviews
CameraLiveView layoutSubviews frame {{0, 0}, {414, 232.66666666666666}}
5. layoutSubviews
CameraLiveView layoutSubviews frame {{0, 0}, {414, 232.66666666666666}}

OC 如何设置 xib 中的子视图为为父视图的大小

有两种方法可以设置 xib 中的子视图为父视图的大小:

  1. 使用 Auto Layout。在 Auto Layout 中,您可以使用 translatesAutoresizingMaskIntoConstraints 属性来设置子视图的大小。如果您将此属性设置为 false,则子视图将自动调整大小以适应其父视图。
  2. 使用手动布局。在手动布局中,您可以使用 frame 属性来设置子视图的大小。您可以使用 CGRectGetWidth()CGRectGetHeight() 函数来获取父视图的宽度和高度。然后,您可以使用这些值来设置子视图的大小。

以下是使用 Auto Layout 设置子视图为父视图大小的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建一个子视图
UIView *subView = [[UIView alloc] init];

// 将子视图添加到父视图
[self.view addSubview:subView];

// 设置子视图的大小为父视图的大小
subView.translatesAutoresizingMaskIntoConstraints = NO;

// 创建一个约束,将子视图的宽度设置为父视图的宽度
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0];

// 创建一个约束,将子视图的高度设置为父视图的高度
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0];

// 将约束添加到视图层次结构中
[self.view addConstraints:@[widthConstraint, heightConstraint]];

以下是使用手动布局设置子视图为父视图大小的示例:

1
2
3
4
5
6
7
8
// 创建一个子视图
UIView *subView = [[UIView alloc] init];

// 将子视图添加到父视图
[self.view addSubview:subView];

// 设置子视图的 frame
subView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

awakeFromNib 中获取子视图的子视图为 null

didMoveToSuperview 事件中获取。

先调用和后调用 superawakeFromNib 函数的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@interface MySubview : UIView
@end

@implementation MySubview

- (void)awakeFromNib {
[super awakeFromNib];

// 在这里添加约束或者改变外观等操作
self.layer.cornerRadius = 10;
self.layer.borderWidth = 1;
self.layer.borderColor = [UIColor grayColor].CGColor;
}

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
@interface MySubview : UIView
@end

@implementation MySubview

- (void)awakeFromNib {
// 在这里添加约束或者改变外观等操作
self.layer.cornerRadius = 10;
self.layer.borderWidth = 1;
self.layer.borderColor = [UIColor grayColor].CGColor;
[super awakeFromNib];
}
@end

上面的代码和下面的代码的区别在于,上面的代码先调用了 superawakeFromNib 方法,然后再添加了设置视图属性的代码,而下面的代码先添加了设置视图属性的代码,然后再调用了 superawakeFromNib 方法。

awakeFromNib 方法中,我们通常需要先调用 superawakeFromNib 方法,以确保父类的初始化操作得以顺利执行。然后再添加我们自己的代码,以完成特定的初始化操作。

因此,上面的代码是正确的写法,而下面的代码可能会导致一些意外的问题,例如父类的初始化操作可能会依赖于子类的属性,而这些属性在子类的 awakeFromNib 方法被调用之前还没有被设置。

需要注意的是,awakeFromNib 方法只会在 xib 文件中加载视图时调用一次,因此如果子视图在运行时动态添加或者移除,awakeFromNib 方法不会再次被调用。如果你需要在运行时执行一些特定的操作,可以考虑使用其他方法,例如 willMoveToSuperview: 或者 didMoveToWindow: 方法。

Unexpected failure

1
2
3
4
5
6
7
8
9
10
11
12
13

...
yolink_ipc.bundle/
rsync: delete_file: rmdir "/Users/gan/Library/Developer/Xcode/DerivedData/Runner-djqhtrdgutewujghuzpngrhrkbck/Build/Products/Debug-iphoneos/Runner.app/yolink_ipc.bundle/CameraPlayerView.nib" failed: Directory not empty (66)
yolink_ipc.bundle/Info.plist

sent 19816 bytes received 48 bytes 39728.00 bytes/sec
total size is 3087767 speedup is 155.45
rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/a0876c02-1788-11ed-b9c4-96898e02b808/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996) [sender=2.6.9]
/Users/gan/Documents/yolink/yosmart_flutter/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh: line 7: realpath: command not found
:128: error: Unexpected failure

Unexpected failure

执行下 Clean Build Folder(Command + Shift + K)即可。

Xcode add constraint disable

xcode - "Add New Constraints" checkboxes and fields are disabled - Stack Overflow

iOS 开发可视化编程之 XIB

https://ganzhixiong.com/p/89fd729c/

Author

干志雄

Posted on

2023-07-25

Updated on

2023-07-25

Licensed under

Comments