런타임에 특정 하위 보기에 대해 자동 레이아웃을 사용하지 않도록 설정할 수 있습니까?
저는 프레임을 프로그래밍 방식으로 조작해야 하는 보기를 가지고 있습니다. 일종의 문서 보기로, 내용을 래핑한 다음 프레임 원점을 조작하여 수퍼 뷰를 중심으로 스크롤 및 확대/축소합니다.자동 레이아웃은 런타임에 이것과 싸웁니다.
자동 레이아웃을 완전히 비활성화하는 것은 다른 보기의 레이아웃을 처리하는 데 합리적으로 사용될 수 있기 때문에 다소 어려운 것 같습니다.제가 원하는 것은 일종의 "늘 제약"인 것 같습니다.
저도 같은 문제가 있었습니다.하지만 난 해결했습니다.
예, 특정 시간 동안 런타임에 자동 레이아웃을 사용하지 않도록 설정할 수 있습니다.UIView
Xcode 4.3 이상에서 기본적으로 설정된 전체 xib 또는 스토리보드에 대해 비활성화하는 대신
트translatesAutoresizingMaskIntoConstraints
YES
하위 보기의 프레임을 설정하기 전에:
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
실행 시 자동 레이아웃이 프레임 설정의 일부를 재정의하는 유사한 문제가 있었습니다(일부 경우 새로운 뷰 컨트롤러를 푸시하는 동적 뷰).를 누른 다음 뒤로를 누르면 초기 보기가 재설정됩니다.
저는 제 조작 코드를 넣음으로써 이것을 모면했습니다.viewDidLayoutSubviews
는 제약조건이되든 그 , viewDidAppe가 나타나기 는 전혀 못합니다.이것은 제약 조건 mojo가 호출된 후에 호출되는 것처럼 보이지만, 보기 전에 Did가 나타나서 사용자는 전혀 알지 못합니다.
아마도 그냥 설정.translatesAutoresizingMaskIntoConstraints
YES
(해당 보기에 영향을 미치는 추가 제약 조건을 추가하지 않음) 자동 레이아웃 시스템과 싸우지 않고 프레임을 설정할 수 있습니다.
iOS 8에서 NS 레이아웃 제약 조건을 활성화 또는 비활성화로 설정할 수 있습니다.따라서 인터페이스 빌더를 사용하는 경우 모든 제약 조건을 Outlet Collection에 추가한 다음 다음을 사용하여 활성화 또는 비활성화합니다.
NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
여기서 사용하는 특정 응용 프로그램은 세로 모드와 가로 모드에서 서로 다른 제약 조건을 가지고 있으며 장치의 회전에 따라 활성화/비활성화됩니다.즉, 인터페이스 빌더에서 두 방향 모두에 대해 복잡한 레이아웃 변경을 만들 수 있으며 상세한 자동 레이아웃 코드 없이 자동 레이아웃을 사용할 수 있습니다.
또는 removeConstraints 및 addConstraints를 사용하여 활성화/비활성화할 수 있습니다.
이것이 다른 사람들에게 도움이 될지는 모르겠지만, 저는 이것을 편리하게 하기 위해 카테고리를 썼습니다. 왜냐하면 저는 이것을 하는 제 자신을 많이 발견하기 때문입니다.
UIView+사용 안 함자동 레이아웃일시적으로.
#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+사용 안 함자동 레이아웃일시적으로.
#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];
}];
도움이 되길 바랍니다.
▁the를 설정할 수 .translatesAutoresizingMaskIntoConstraints
형자Boolean
theUser Defined Runtime 의 xib.xib/storyboard의 User Runtime Attributes는 User Defined Runtime Attributes의 예입니다.
제가 보기에는 라벨과 텍스트가 있었습니다.그 라벨에는 팬 제스처가 있었습니다.끌면 레이블이 잘 움직입니다.그러나 텍스트 상자 키보드를 사용하면 레이블이 자동 레이아웃에 정의된 원래 위치로 위치를 재설정합니다.라벨에 대해 아래 내용을 신속하게 추가하여 문제가 해결되었습니다.WillApear 보기에 추가했지만 대상 필드에 액세스할 수 있는 거의 모든 위치에 추가할 수 있습니다.
self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
- 4.5에서 프로젝트 열기
- 스토리보드 선택
- 파일 검사기 열기
- 인터페이스 작성기 문서에서 '자동 레이아웃 사용' 선택 취소
일부 보기에 자동 레이아웃을 사용하려는 경우 여러 스토리보드로 분할할 수 있습니다.
저는 서브뷰를 프로그래밍 방식으로 생성하는 작업을 했습니다. 저의 경우 자동 레이아웃이 중심을 중심으로 회전해야 하는 뷰를 방해했지만 일단 이 뷰를 프로그래밍 방식으로 생성하면 작동했습니다.
비슷한 시나리오를 본 적이 있습니다. 자동 레이아웃으로 시작한 프로젝트에 참여했지만 몇 가지 보기를 동적으로 조정해야 했습니다.다음은 저에게 효과가 있었던 것입니다.
인터페이스 작성기에 배치된 뷰 또는 구성요소가 없습니다.
할당/초기화로 시작하여 프레임을 적절하게 설정하여 보기를 프로그래밍 방식으로 추가합니다.
다 했어요.
스토리보드나 xib 파일이 없는 프로젝트에서 이런 일이 발생했습니다.모두 100% 코드입니다.저는 하단에 광고 배너가 있었고 광고 배너에서 뷰 경계가 멈추기를 원했습니다.로드 후 보기 크기가 자동으로 조정됩니다.저는 이 페이지의 모든 해결책을 시도했지만 아무 것도 작동하지 않았습니다.
축소된 높이로 하위 뷰를 생성하여 컨트롤러의 기본 뷰에 배치했습니다.그런 다음 모든 콘텐츠가 하위 보기로 이동했습니다.그것은 그 문제가 결정에 어긋나는 것처럼 느껴지는 어떤 일도 하지 않고 아주 쉽게 해결했습니다.
일반적인 크기가 아닌 보기를 원하신다면 하위 보기를 사용하셔야 할 것 같습니다.
자동 레이아웃을 비활성화하는 대신 교체할 프레임으로 새 제약 조건을 계산합니다.그것이 제게는 적절한 방법인 것 같습니다.제약 조건에 의존하는 성분을 조정하는 경우 그에 따라 조정합니다.
예를 들어, 두 뷰(MyView 및 기타 뷰) 사이에 수직 제약 조건이 0인 경우, 이동 제스처 등으로 myView의 높이를 조정하는 경우 조정된 값을 사용하여 제약 조건을 다시 계산할 수 있습니다.
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
자동 레이아웃을 사용하시는 분들은 여기에서 제 솔루션을 확인해 주십시오.당신은 만들고 있어야 합니다.@IBOutlet
조정한 다음 상수를 변경할 제약 조건의 '입니다.
xib 파일인 경우:
- .xib 파일을 선택합니다.
- "파일 소유자"를 선택합니다.
- 유틸리티 표시
- 클릭: "파일 검사기"
- "인터페이스 작성기 문서"에서 "자동 레이아웃 사용" 사용 안 함
언급URL : https://stackoverflow.com/questions/11368440/can-i-disable-autolayout-for-a-specific-subview-at-runtime
'source' 카테고리의 다른 글
레일: 예외의 전체 스택 추적 기록 (0) | 2023.06.06 |
---|---|
Firebase 분석을 사용하여 Android 조각을 추적하는 방법 (0) | 2023.06.06 |
MongoDB는 신뢰할 수 있습니까? (0) | 2023.06.06 |
mysql/mysadb 10.xx 기본 포트를 변경하는 방법은 무엇입니까? (0) | 2023.06.06 |
구성 중 저장된 Git 사용자 이름과 이메일을 아는 방법은 무엇입니까? (0) | 2023.06.06 |