最佳答案
我知道以前有人问过这个问题,但是答案自相矛盾,我也很困惑,所以请不要激怒我。
我想有一个可重用的 UIView
子类整个应用程序。我想使用一个 nib 文件来描述接口。
现在我们假设它是一个加载指示器视图,其中包含一个活动指示器。我希望在某个事件上实例化这个视图,并在视图控制器的视图中进行动画。我可以用编程的方式描述视图的接口,用编程的方式创建元素,并在 init 方法中设置它们的框架等等。
但是我怎么能用笔尖做到这一点呢?保持 Interface Builder 给定的尺寸,而无需设置框架。
我已经设法这样做了,但我肯定这是错误的(这只是一个视图,在它的采摘) :
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
但是我覆盖了 self,当我实例化它时:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
我必须手动设置的框架,而不是有它从 IB 拾起。
编辑: 我想在视图控制器中创建这个自定义视图,并有权控制视图的元素。我不需要新的视图控制器。
谢谢
编辑: 我不知道这是否是最佳实践,我肯定不是,但我是这样做的:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
还需要正确的练习
这是否应该使用视图控制器和带有 nib 名称的 init 来完成?我是否应该在代码中设置一些 UIView 初始化方法的笔尖?还是说我的所作所为是正确的?