프로그래밍 방식으로 프레임을 조작해야하는 뷰가 있습니다. 프레임 원점을 조작하여 수퍼 뷰를 스크롤하고 확대 / 축소하는 콘텐츠로 래핑되는 일종의 문서 뷰입니다. Autolayout은 런타임에 이것과 싸 웁니다.
자동 레이아웃을 완전히 비활성화하는 것은 다른 뷰의 레이아웃을 처리하는 데 합리적으로 사용될 수 있기 때문에 약간 가혹 해 보입니다. 내가 원하는 것은 일종의 “null 제약”인 것 같습니다.
답변
나는 같은 문제가 있었다. 그러나 나는 그것을 해결했다.
예, UIView
Xcode 4.3 이상에서 기본적으로 설정되는 전체 xib 또는 스토리 보드에 대해 비활성화하는 대신 특정에 대해 런타임에 자동 레이아웃을 비활성화 할 수 있습니다 .
설정 translatesAutoresizingMaskIntoConstraints
에 YES
당신이 당신의 서브 뷰의 프레임을 설정하기 전에 :
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
답변
Autolayout이 런타임에 내 프레임 설정 중 일부를 재정의하는 비슷한 문제가있었습니다 (어떤 경우에는 새 뷰 컨트롤러를 푸시하는 동적 뷰가있었습니다 … 푸시 한 다음 뒤로를 누르면 초기 뷰가 재설정 됨).
viewDidLayoutSubviews
View 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’을 선택 취소하십시오.
일부보기에 자동 레이아웃을 사용하려는 경우 여러 스토리 보드로 분할 할 수 있습니다.
