[xcode] 런타임에 특정 하위보기에 대한 자동 레이아웃을 비활성화 할 수 있습니까?

프로그래밍 방식으로 프레임을 조작해야하는 뷰가 있습니다. 프레임 원점을 조작하여 수퍼 뷰를 스크롤하고 확대 / 축소하는 콘텐츠로 래핑되는 일종의 문서 뷰입니다. Autolayout은 런타임에 이것과 싸 웁니다.

자동 레이아웃을 완전히 비활성화하는 것은 다른 뷰의 레이아웃을 처리하는 데 합리적으로 사용될 수 있기 때문에 약간 가혹 해 보입니다. 내가 원하는 것은 일종의 “null 제약”인 것 같습니다.



답변

나는 같은 문제가 있었다. 그러나 나는 그것을 해결했다.
예, UIViewXcode 4.3 이상에서 기본적으로 설정되는 전체 xib 또는 스토리 보드에 대해 비활성화하는 대신 특정에 대해 런타임에 자동 레이아웃을 비활성화 할 수 있습니다 .

설정 translatesAutoresizingMaskIntoConstraintsYES당신이 당신의 서브 뷰의 프레임을 설정하기 전에 :

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);


답변

Autolayout이 런타임에 내 프레임 설정 중 일부를 재정의하는 비슷한 문제가있었습니다 (어떤 경우에는 새 뷰 컨트롤러를 푸시하는 동적 뷰가있었습니다 … 푸시 한 다음 뒤로를 누르면 초기 뷰가 재설정 됨).

viewDidLayoutSubviewsView Controller 에 조작 코드를 넣어이 문제를 해결했습니다. 이것은 제약 조건 mojo가 호출 된 후에 호출되는 것처럼 보이지만 viewDidAppear 전에 호출되므로 사용자는 현명하지 않습니다.


답변

아마도로 설정 translatesAutoresizingMaskIntoConstraints하고 YES해당 뷰에 영향을 미치는 추가 제약 조건을 추가하지 않는 것만으로도 자동 레이아웃 시스템과 싸우지 않고 프레임을 설정할 수 있습니다.


답변

iOS 8에서는 NSLayoutConstraint를 활성화하거나 비활성화 할 수 있습니다. 따라서 인터페이스 빌더를 사용하는 경우 모든 제약 조건을 OutletCollection에 추가 한 다음 다음을 사용하여 활성화 또는 비활성화합니다.

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)

여기에서 사용하는 특정 응용 프로그램은 세로 및 가로 모드에서 다른 제약 조건을 가지고 있으며 장치의 회전에 따라 활성화 / 비활성화됩니다. 즉, 두 방향 모두에 대해 인터페이스 빌더에서 복잡한 레이아웃 변경을 모두 만들 수 있으며 자세한 자동 레이아웃 코드 없이도 자동 레이아웃을 사용할 수 있습니다.

또는 removeConstraints 및 addConstraints를 사용하여 활성화 / 비활성화 할 수 있습니다.


답변

이것이 다른 사람에게 도움이 될지는 모르겠지만,이 일을 많이하게 되었기 때문에 이것을 편리하게하기 위해 카테고리를 썼습니다.

UIView + DisableAutolayoutTemporarily.h

#import <UIKit/UIKit.h>

@interface UIView (DisableAutolayoutTemporarily)

// the view as a parameter is a convenience so we don't have to always
// guard against strong-reference cycles
- (void)resizeWithBlock:(void (^)(UIView *view))block;

@end

UIView + DisableAutolayoutTemporarily.m

#import "UIView+DisableAutoResizeTemporarily.h"
@implementation UIView (DisableAutoResizeTemporarily)

- (void)resizeWithBlock:(void (^)(UIView * view))block
{
    UIView *superview = self.superview;
    [self removeFromSuperview];
    [self setTranslatesAutoresizingMaskIntoConstraints:YES];
    __weak UIView *weakSelf = self;
    block(weakSelf);
    [superview addSubview:self];
}

@end

다음과 같이 사용합니다.

[cell.argumentLabel resizeWithBlock:^(UIView *view) {
    [view setFrame:frame];
}];

도움이되기를 바랍니다.


답변

xib / storyboard에서 원하는 UIView의 User Defined Runtime Attributes에서 translatesAutoresizingMaskIntoConstraints유형 Boolean, Value Yes를 설정할 수 있습니다 .


답변

  • 4.5에서 프로젝트 열기
  • 스토리 보드 선택
  • 파일 검사기 열기
  • Interface Builder Document에서 ‘Use Autolayout’을 선택 취소하십시오.

일부보기에 자동 레이아웃을 사용하려는 경우 여러 스토리 보드로 분할 할 수 있습니다.