最近遇到一个这样的问题,在应用当中有多个ViewController中包含相同布局的SubView。于是就想把这样的View 提取出来做一个自定义的View,这样就可以避免在storyboard中反复绘制相同的东西,代码上也可以降低重复。
摸索了之后总结出下面的步骤:
1,创建UIView 的SubClass 命名为MyView
2, new一个名为MyView的xib
p1
3,配置xib的属性
p2
4,为View 添加背景色,添加一个按钮并定制按钮约束,这里我添加的约束为垂直居中,Button与View等宽,Button左边起点位置为0。
p3
5,设置xib中的File’s owner = MyView, 拖拽view 到关联的代码中命名为contentView
p4
6, 在storyboard 中对ViewController 添加一个View,之后把View 的class 设为MyView
7,MyView.m中添加代码
- (void)awakeFromNib
{
NSLog(@"awake from nib");
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.contentView];
}
这样执行后就可以看到该View了,但是会有一个严重的问题,那就是MyView 在显示时没有做到AutoLayout。仅仅是按照xib中的尺寸来显示,而在实际应用中可能我们会期待在ViewController中使用的自定义View内部亦可以自动匹配大小。
对于上面的问题,我的解决方法是重写setFrame方法,如下:
8,MyView.m中添加代码
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
CGRect rect = frame;
rect.origin.x = 0;
rect.origin.y = 0;
self.contentView.frame = rect;
}
StoryBoard中拖拽MyView IBOutLet到 ViewController中
p5
ViewDidLoad 中增加代码
[self.myView setFrame:self.myView.frame];
这样就可以让storyBoard 中设置的约束正确的影响到MyView。
p6
至此,问题已经基本上得到解决。后续问题就不在本文中进行描述了。