내 응용 프로그램의 경우 장치를 회전하면 위치가 변경되는 두 개의 하위보기가있는보기를 디자인했습니다. 즉, 세로보기에있을 때 쌓이고 가로에있을 때 나란히 쌓입니다. ios7 용으로 작성한 코드는 완벽하게 작동했습니다. ios8로 마이그레이션 한 후 다시 작동하도록 만들 수 없습니다. 뷰가 처음 나타날 때 올바르게 표시되지만 회전하거나 다른 화면에서 돌아온 후에는 두 뷰가 모두 화면 외부에서 렌더링되는 것처럼 보입니다 (애니메이션 중에 표시됨). 나는 여기서 내가 뭘 잘못하고 있는지 알 수 없다. 로그는 만족할 수없는 제약에 대해 침묵합니다.
표시, 제약 및 회전과 관련된 내 코드 :
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
UIInterfaceOrientation o = size.height > size.width ? UIInterfaceOrientationPortrait : UIInterfaceOrientationLandscapeLeft;
[self updateLayoutWithOrientation:o];
} completion:nil];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self updateLayoutWithOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}
- (void)updateLayoutWithOrientation:(UIInterfaceOrientation)o
{
[self.view removeConstraints:self.view.constraints];
if (UIInterfaceOrientationIsPortrait(o)) {
[self setDetailsAndGalleryViewsConstraints:@"V:|-[galleryView(<=664)]-[detailsView]-|"];
[self setGalleryViewConstraint:@"H:|-[galleryView]-|"];
[self setDetailsViewConstraint:@"H:|-[detailsView]-|"];
} else {
[self setDetailsAndGalleryViewsConstraints:@"H:|-[galleryView(==664)]-[detailsView]-|"];
[self setGalleryViewConstraint:@"V:|-[galleryView]-|"];
[self setDetailsViewConstraint:@"V:|-[detailsView]-|"];
}
}
- (void)setGalleryViewConstraint:(NSString *)format
{
[self setConstraint:format onView:self.view views:NSDictionaryOfVariableBindings(galleryView);];
}
- (void)setDetailsViewConstraint:(NSString *)format
{
[self setConstraint:format onView:self.view views:NSDictionaryOfVariableBindings(detailsView)];
}
- (void)setDetailsAndGalleryViewsConstraints:(NSString *)format
{
[self setConstraint:format onView:self.view views:NSDictionaryOfVariableBindings(galleryView, detailsView)];
}
- (void)setConstraint:(NSString *)format onView:(UIView *)targetView views:(NSDictionary *)views
{
[targetView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:format
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:views
]];
}
최신 정보
@sha 제안에 따라 런타임에 제약 조건을 검사했습니다. 관계가 어떻게 번역되는지보기 위해 코드를 약간 수정했습니다.
[self setDetailsAndGalleryViewsConstraints:@"V:|-(1)-[galleryView(<=664)]-(2)-[detailsView]-(3)-|"];
[self setGalleryViewConstraint:@"H:|-(4)-[galleryView]-(5)-|"];
[self setDetailsViewConstraint:@"H:|-(6)-[detailsView]-(7)-|"];
결과는 다음과 같습니다.
나를 놀라게하는 것은 첫 번째보기가 top
두 번, 한 번은 수퍼 뷰로 , 그 다음에는 형제에게 지정 했다는 것입니다 . 그러나 나는 그것이 예상되는지, 그렇지 않다면 그것을 고치는 방법을 모릅니다.
최신 정보
레이아웃을 수동으로 설정하는 것을 건너 뛰고 대신 크기 클래스를 사용하려고했지만 iPad가 일반 너비와 일반 높이를 가지고있어 특정 방향을 변경할 수 없습니다. 운없이 특성 수집을 재정의하려고했습니다.
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// tried it also in coordinator:animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> method
[self updateLayoutWithOrientation:size];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self updateLayoutWithOrientation:self.view.bounds.size];
}
- (void)updateLayoutWithOrientation:(CGSize)screenSize
{
NSArray *traitArray;
if (screenSize.height > screenSize.width) {
traitArray = [NSArray arrayWithObjects:
[UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular],
[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular],
nil];
} else {
traitArray = [NSArray arrayWithObjects:
[UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact],
[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular],
nil];
}
UITraitCollection *traits = [UITraitCollection traitCollectionWithTraitsFromCollections:traitArray];
[self setOverrideTraitCollection:traits forChildViewController:self];
}
나는 또한 iOS 8의 제약과 싸우고 있습니다 (iOS 7에서는 문제 없음)
나는 전화가
[self.view removeConstraints:self.view.constraints];
모든 제약 조건을 제거하지 않습니다!
마지막으로 내 문제를 해결하고 모든 경고를 제거하기 위해 제약 우선 순위를 사용했습니다. 이런 식으로 제약 조건을 제거 할 필요가 없으며 경고도받지 않습니다. 이것이 도움이되기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다