이 질문이 이전에 요청 된 것을 알고 있지만 답변이 모순되고 혼란 스럽기 때문에 나를 화나게하지 마십시오.
UIView
내 앱 전체 에서 재사용 가능한 하위 클래스 를 갖고 싶습니다 . nib 파일을 사용하여 인터페이스를 설명하고 싶습니다.
이제 활동 표시기가있는 로딩 표시기보기라고 가정 해 보겠습니다. 이 뷰를 인스턴스화하고 뷰 컨트롤러의 뷰에 애니메이션을 적용하는 이벤트를 원합니다. 뷰의 인터페이스를 프로그래밍 방식으로 설명 할 수 있고, 요소를 프로그래밍 방식으로 생성하고 프레임을 init 메서드 등으로 설정할 수 있습니다.
그래도 펜촉을 사용하여 어떻게 할 수 있습니까? 프레임을 설정하지 않고도 인터페이스 빌더에 제공된 크기를 유지합니다.
나는 이렇게 할 수 있었지만 그것이 잘못되었다고 확신합니다 (선택 기가있는보기 일뿐입니다).
- (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 이름으로 초기화해야합니까? 코드의 일부 UIView 초기화 방법에서 펜촉을 설정해야합니까? 아니면 내가 한 일이 괜찮습니까?
initWithDataSource
않습니까? 어쨌든 소유자를 '무효'로 주더라도 작동합니다.