[Ios] Storyboards 또는 Interface Builder를 사용하지 않는 AutoLayout


Answers

Question

Storyboard와 Interface Builder를 일반적으로 사용하는 것을 완전히 피하고자하는 앱을 개발 중이므로 모든 UI를 코드에 지정해야합니다. PureLayout , AutoLayout 제약 조건을 구성하는 좋은 API를 사용하고 있습니다.

그러나, 내 문제는 인터페이스 빌더를 사용하지 않을 때 AutoLayout 이 비활성화 된 것처럼 보입니다. updateViewConstraints , PureLayout 작성자가 제공 한 권장 사항에 따라 레이아웃을 배치하는 메서드는 전혀 호출되지 않습니다.

내 설정에 대한 정보를 조금 더 제공하기 만하면됩니다.

  • Main.storyboard 를 삭제하고 Info.plist 에서 항목을 제거함
  • AppDelegate.m 에서 수동으로 self.window 를 설정하고 self.window 에서 UINavigationController 를 추가하십시오.

언급 한 바와 같이, 주요 문제는 MainViewController 에서 updateViewConstraints 가 호출되지 않지만 UI 요소가 초기화 중에 전달 된 frame 모두 표시된다는 것입니다.

참고 : 필자는 AutoLayout 을 사용할지 여부를 지정할 수있는 인터페이스 작성기의 확인란을 모방하기 위해 어딘가에서 일부 플래그를 활성화해야하는 것처럼 보입니다.

MainViewController.m

@interface MainViewController ()

@property (nonatomic, strong) UIButton *startButton;
@property (nonatomic, assign) BOOL didSetupConstraints;

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view addSubview:self.startButton];
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

- (UIButton *)startButton
{
    if (!_startButton) {
        UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];
        CGRect startButtonFrame = CGRectMake(75.0, 75.0, 250.0, 44.0);
        startButton.frame = startButtonFrame;
        [startButton setTitle:@"Start" forState:UIControlStateNormal];
        [startButton setTranslatesAutoresizingMaskIntoConstraints:NO];
        _startButton = startButton;
    }
    return _startButton;
}

- (void)updateViewConstraints
{
    NSLog(@"Update view contraints");
    if (!self.didSetupConstraints) {
        [self.startButton autoCenterInSuperview];
        self.didSetupConstraints = YES;
    }
    [super updateViewConstraints];
}

@end