loadNibNamed 대프레임 높이와 너비 설정에 대한 initWithFrame 딜레마
-
13-12-2019 - |
문제
.xib 파일과 연결된 UIView 하위 클래스를 만들었습니다.이 UIView 하위 클래스는 UIViewController에서 사용됩니다.컨트롤러에는 UIView 하위 클래스를 인스턴스화하는 방법에 두 가지 옵션이 있다고 생각합니다.
MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
그리고
MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView"
owner:self
options:nil] lastObject];
나는 사용자 정의 초기화를 수행할 수 있는 첫 번째 접근 방식이나 그 변형을 선호합니다.유일한 문제는 .xib
(프레임의 높이와 너비를 의미합니다. MyUIView
).예, 다음에 다시 하드코딩할 수 있습니다. aRect
, 그러나 이는 유지 관리가 지루합니다(예: .xib에서 UI 위치를 변경하면 업데이트해야 함). aRect
, 도).
따라서 프레임 직사각형이 자동으로 설정되므로 두 번째 접근 방식을 염두에 두어야 합니다.남은 문제는 초기화를 사용자 정의할 수 없다는 것입니다(예: 초기화 중에 추가 매개변수를 전달하고 싶습니다).
당신의 선호는 무엇입니까?당신의 생각에는 어느 것이 더 나은가요?
편집1:Sergio의 답변에서 영감을 받아 다음 해결 방법을 생각해 냈습니다.
// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];
// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView"
owner:self
options:nil] lastObject];
[self setFrame:CGRectMake(frame.origin.x,
frame.origin.y,
[self frame].size.width,
[self frame].size.height)];
// frame's width and height already determined after
// loadNibNamed was called
...
}
return self;
}
해결책
다음을 사용해 보셨나요?
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];
귀하의 경우(펜촉에서 뷰 로드) 작동하는지 모르겠지만 프로그래밍 방식으로 사용자 정의 뷰를 생성할 때 성공적으로 사용했습니다.
시도해 볼 수 있습니다.
편집하다:
당신은 당신 자신을 정의할 수 있습니다 init
보기 방법:
-(id)initWithPosition:(CGPoint)pos;
그런 다음 전화하십시오.
-(id)initWithPosition:(CGPoint)pos {
if (self = [super initWithFrame:{pos,{0,0}}]) {
self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView"
owner:self
options:nil] lastObject];
[self setFrame:CGRectMake(frame.origin.x,
frame.origin.y,
[self frame].size.width,
[self frame].size.height)];
// frame's width and height already determined
// after loadNibNamed was called
}
제휴하지 않습니다 StackOverflow