문제

.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

  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top