답변:
나는 같은 문제가 있었다. 그러나 나는 그것을 해결했다.
예, 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 전에 호출되므로 사용자는 현명하지 않습니다.
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 파일이없는 프로젝트에서 나에게 일어났습니다. 모두 100 % 코드입니다. 하단에 광고 배너가 있었고 뷰 경계가 광고 배너에서 멈추기를 원했습니다. 뷰는로드 후 자동으로 크기가 조정됩니다. 이 페이지의 모든 해결책을 시도했지만 어느 것도 작동하지 않았습니다.
높이가 짧아 진 하위 뷰를 만들어 컨트롤러의 메인 뷰에 배치했습니다. 그런 다음 모든 콘텐츠가 하위 뷰에 들어갔습니다. 그것은 곡물에 반하는 것처럼 느껴지는 일을하지 않고도 문제를 매우 쉽게 해결했습니다.
창을 채우는 정상적인 크기가 아닌보기를 원한다면 하위보기를 사용해야한다고 생각합니다.
자동 레이아웃을 비활성화하는 대신 교체하려는 프레임으로 새 제약 조건을 계산합니다. 그것은 나에게 적절한 방법으로 보입니다. 제약 조건에 의존하는 구성 요소를 조정하는 경우 적절하게 조정하십시오.
예를 들어 두 뷰 (myView 및 otherView) 사이에 0의 수직 제약 조건이 있고 이동 제스처 또는 myView의 높이를 조정하는 무언가가있는 경우 조정 된 값으로 제약 조건을 다시 계산할 수 있습니다.
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
xib 파일 인 경우 :