ProgramingTip

UIViewController의 뷰를 서브 뷰로 추가하는 방법

bestdevel 2020. 10. 18. 18:52
반응형

UIViewController의 뷰를 서브 뷰로 추가하는 방법


Google 직원을 위해이 QA는 이제 6 년이 지났습니다 .

아래 Micky와 다른 사람들이 언급했듯이, 이제 iOS의 컨테이너 를 사용하여 매일 수행 됩니다.


많은 하위 뷰를 제어하는 ​​ViewController가 있습니다. 버튼 중 하나를 클릭하면 다른 뷰 컨트롤러를 초기화 하고이 뷰의 하위 뷰로 뷰를 표시합니다. 그러나 subview는 경계를 초과하고 실제로 전체 화면을 채 선택합니다.

무엇이 잘못입니까? 문제는 UIViewController의 뷰에 프레임 (0,0,320,460)이있어 전체 화면을 채운다 고 가정합니다 (하위 뷰 프레임 경계 내에서 터치 할 때만 터치 이벤트를 수신하지만). 서브 뷰에 맞게 프레임 크기를 어떻게 조정할 수 있습니까?

요컨대, 뷰 컨트롤러의 뷰를 다른 뷰 컨트롤러의 뷰에 하위 뷰로 추가하는 데 도움이됩니다.

감사합니다!


에서 iOS 5 부터 애플은 특히 addChildViewController 와 같은 메서드를 통해 의 UIViewController 를 다른 있는 UIViewController 에 추가 할 목적으로 user-지정 컨테이너 를 만들 수 있으므로 실제로 있는 UIViewController 를 중첩 할 수 있습니다.

편집 : 링크를 피하기 위해 내부 요약 포함

나는 인용한다 :

iOS는 앱을 구성하는 데 도움이되는 많은 표준 컨테이너를 제공합니다. 그러나 시스템 컨테이너에서 제공하는 것과 일치하지 않는 사용자 지정 워크 플로를 어느 경우에도 있습니다. 아마도 여러분의 비전에서 앱 에는 특수한 탐색 제스처 또는 애니메이션 전환 이있는 하위보기 컨트롤러의 특정 구성이 필요 합니다. 그렇게 광고주가 정의한 컨테이너를 구현 - 자세한 설명을 ...

...과 :

당신이 용기를 디자인 할 때, 당신은 당신의 용기, 부모, 그리고 다른 뷰 컨트롤러, 마이의 사이의 명시 적 부모-관계를 만들 - 자세한 설명을

샘플 (Apple 문서 제공) 컨테이너의 뷰 계층에 다른 뷰 컨트롤러의 뷰 추가

- (void) displayContentController: (UIViewController*) content
{
   [self addChildViewController:content];                 
   content.view.frame = [self frameForContentController]; 
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          
}

건배,

미키 던컨


이 사람들은 http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx 해먹습니다 .

UIView를 추가하고 헤더에 연결합니다.

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;

In- (void) viewDidLoad는 다음을 수행합니다.

ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
    nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
    [self.addViewToAddPlot addSubview:nonSystemsController.view];
    [self addChildViewController:nonSystemsController];
    [nonSystemsController didMoveToParentViewController:self];

즐겨


이 답변은 이전 버전의 iOS에 적합하지만 이제는 사용되지 않습니다. Micky Duncan의 답변을 대답합니다.

이러지마! 의 의도 UIViewController는 전체 화면을 구동하는 것입니다. 이것에 필요한 것을 추가하지 않습니다.

사용자 정의보기를 소유하는 개체 만 있으면됩니다. UIView자신 의 하위 클래스를 사용하기 만하면 창 계층 구조에 추가 할 수있는 메모리 관리가 자동으로 수행됩니다.

하위보기 NIB의 소유자에게 UIView. contentView이 사용자 지정 하위 클래스에 콘센트를 추가 하고 펜촉 내의보기를 가리 있습니다. 사용자 정의 하위 클래스에서 다음과 같이하십시오.

- (id)initWithFrame: (CGRect)inFrame;
{
    if ( (self = [super initWithFrame: inFrame]) ) {
        [[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
                                      owner: self
                                    options: nil];
        contentView.size = inFrame.size;
        // do extra loading here
        [self addSubview: contentView];
    }
    return self;
}

- (void)dealloc;
{
    self.contentView = nil;
    // additional release here
    [super dealloc];
}

(여기서는 initWithFrame:하위 뷰를 구성하는 데 사용 가정합니다 .)


이 모든 답변이 약간의 불완전 생각하는 viewController의 뷰를 다른 viewController의 뷰의 하위로 추가하는 적절한 방법은 다음과 가능합니다.

    [self addChildViewController:viewControllerToAdd];
    [self.view addSubview:viewControllerToAdd.view];
    [viewControllerToAdd didMoveToParentViewController:self];

원하는 경우에 코드에 스 니펫으로 복사 할 수 있습니다. 그래서 코드 대체 형식을 이해하지 못하는 것 같지만 Xcode에서 깨끗하게 표시됩니다.

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];

willMove 는 addChild와 함께 자동으로 호출됩니다. 감사합니다 @iOSSergey

사용자 지정 컨테이너가 addChildViewController : 메서드를 호출하면 추가하기 전에 자식으로 추가 할 뷰 컨트롤러의 willMoveToParentViewController : 메서드를 자동으로 호출합니다.


사용하다:

[self.view addSubview:obj.view];

의 프레임 크기를 변경 viewcontroller.view.frame한 다음 하위 뷰에 추가합니다.[viewcontrollerparent.view addSubview:viewcontroller.view]


해당 프레임에 맞게 경계 속성을 설정해야합니다. 수퍼 뷰 속성을 프레임 화하고 경계는 뷰 자체 좌표계에서 프레임을 제한합니다.


당신은 당신이 확인할 수있는 하위 뷰로의 UIViewController을 보여줍니다 동일 하나 SDK에 대한 PopupController을 사용할 수 있습니다 PopupController을

다음은 동일한 샘플 코드입니다.

popup = PopupController
        .create(self.navigationController!)
        .customize(
            [
                .layout(.center),
                .animation(.fadeIn),
                .backgroundStyle(.blackFilter(alpha: 0.8)),
                .dismissWhenTaps(true),
                .scrollable(true)
            ]
        )
        .didShowHandler { popup in
        }
        .didCloseHandler { popup in
    }
    let container = MTMPlayerAndCardSelectionVC.instance()
    container.closeHandler = {() in
        self.popup.dismiss()
    }

    popup.show(container)

참고 URL : https://stackoverflow.com/questions/1486832/how-to-add-an-uiviewcontrollers-view-as-subview

반응형