この質問が以前に尋ねられたことは承知していますが、答えは矛盾していて混乱していますので、私を怒らせないでください。
UIView
アプリ全体で再利用可能なサブクラスを使用したいと考えています。nibファイルを使用してインターフェイスを記述したいと思います。
ここで、アクティビティインジケーターを含む読み込みインジケータービューであるとしましょう。いくつかのイベントで、このビューをインスタンス化し、ビューコントローラーのビューにアニメーション化したいと思います。プログラムでビューのインターフェイスを問題なく説明し、要素をプログラムで作成し、フレームをinitメソッド内に設定することなどができます。
どうすればnibを使用してこれを行うことができますか?フレームを設定せずに、インターフェイスビルダーで指定されたサイズを維持します。
私はなんとかこうやってそれをすることができました、しかし私はそれが間違っていると確信しています(それはその中にピッカーを持つ単なるビューです):
- (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;
}
しかし、私は自分を上書きしています。それをインスタンス化すると、次のようになります。
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
フレームをIBからピックアップするのではなく、手動で設定する必要があります。
編集:ビューコントローラーでこのカスタムビューを作成し、ビューの要素を制御するアクセス権を取得したいと考えています。新しいView Controllerは欲しくない。
ありがとう
編集:これがベストプラクティスかどうかはわかりませんが、そうでないと確信していますが、これは私がやった方法です:
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名で初期化されている必要がありますか?コードの一部のUIView初期化メソッドでnibを設定する必要がありますか?それとも私がやったことは大丈夫ですか?
initWithDataSource
か?とにかく、所有者に「Nil」を指定してもこれは機能します。