iPad ios8에서 다른 방향으로 다른 레이아웃

Mcveat

내 응용 프로그램의 경우 장치를 회전하면 위치가 변경되는 두 개의 하위보기가있는보기를 디자인했습니다. 즉, 세로보기에있을 때 쌓이고 가로에있을 때 나란히 쌓입니다. 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];
}
PatrickV

나는 또한 iOS 8의 제약과 싸우고 있습니다 (iOS 7에서는 문제 없음)

나는 전화가

[self.view removeConstraints:self.view.constraints];

모든 제약 조건을 제거하지 않습니다!

마지막으로 내 문제를 해결하고 모든 경고를 제거하기 위해 제약 우선 순위를 사용했습니다. 이런 식으로 제약 조건을 제거 할 필요가 없으며 경고도받지 않습니다. 이것이 도움이되기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

iPad ios8에서 다른 방향으로 다른 레이아웃

분류에서Dev

IOS 8 적응 형 레이아웃. iPad 방향에 대한 다른 레이아웃

분류에서Dev

동일한 Storyboard에서 iPhone 및 iPad의 다른 레이아웃

분류에서Dev

다른 로거에 대한 NLog 다른 레이아웃

분류에서Dev

Android에서 다른 레이아웃으로 활동 전환

분류에서Dev

Android 프로그래밍 방식으로 다른 레이아웃에 레이아웃보기 추가

분류에서Dev

다른 레이아웃으로 출력

분류에서Dev

다른 경로에 대한 AngularJs 다중 레이아웃

분류에서Dev

Android에서 다른 레이아웃을 표시하는 방법

분류에서Dev

Android에서 한 레이아웃을 다른 레이아웃으로 슬라이딩

분류에서Dev

버튼을 사용하여 한 레이아웃에서 다른 레이아웃으로 이동

분류에서Dev

버튼을 사용하여 한 레이아웃에서 다른 레이아웃으로 이동

분류에서Dev

다른 펜촉을로드 할 때 iOS 자동 레이아웃

분류에서Dev

다른 펜촉을로드 할 때 iOS 자동 레이아웃

분류에서Dev

레이아웃에서 다른 레이아웃으로 Android 텍스트 필드 및 텍스트보기

분류에서Dev

iOS8에서 iOS 시뮬레이터와 장치간에 NSNumber에서 BOOL 로의 다른 결과

분류에서Dev

서로 다른 레이아웃의 두 구성 요소 사용

분류에서Dev

Lubuntu에 다른 레이아웃 추가

분류에서Dev

Lubuntu에 다른 레이아웃 추가

분류에서Dev

다른 레이아웃 위에 레이아웃 설정

분류에서Dev

레이아웃을 다른 레이아웃 내부에 정렬

분류에서Dev

플렉스 방향 행과 서로 다른 행 높이가있는 플렉스 그리드 레이아웃

분류에서Dev

Android : 한 레이아웃 활동에서 다른 활동으로 전환

분류에서Dev

한 활동에서 다른 활동으로 레이아웃 전달

분류에서Dev

다른 레이아웃의 맨 아래에 레이아웃을 포함하는 방법

분류에서Dev

Android에서 아래 텍스트를 다른 레이아웃으로 나누는 방법

분류에서Dev

Android의 상대 레이아웃 내에서 다른 레이아웃 아래에 각 레이아웃을 설정하는 방법

분류에서Dev

방향이 다른 범위의 "오른쪽에서 왼쪽으로"순서

분류에서Dev

조각 활동에 다른 레이아웃을 동적으로 포함

Related 관련 기사

  1. 1

    iPad ios8에서 다른 방향으로 다른 레이아웃

  2. 2

    IOS 8 적응 형 레이아웃. iPad 방향에 대한 다른 레이아웃

  3. 3

    동일한 Storyboard에서 iPhone 및 iPad의 다른 레이아웃

  4. 4

    다른 로거에 대한 NLog 다른 레이아웃

  5. 5

    Android에서 다른 레이아웃으로 활동 전환

  6. 6

    Android 프로그래밍 방식으로 다른 레이아웃에 레이아웃보기 추가

  7. 7

    다른 레이아웃으로 출력

  8. 8

    다른 경로에 대한 AngularJs 다중 레이아웃

  9. 9

    Android에서 다른 레이아웃을 표시하는 방법

  10. 10

    Android에서 한 레이아웃을 다른 레이아웃으로 슬라이딩

  11. 11

    버튼을 사용하여 한 레이아웃에서 다른 레이아웃으로 이동

  12. 12

    버튼을 사용하여 한 레이아웃에서 다른 레이아웃으로 이동

  13. 13

    다른 펜촉을로드 할 때 iOS 자동 레이아웃

  14. 14

    다른 펜촉을로드 할 때 iOS 자동 레이아웃

  15. 15

    레이아웃에서 다른 레이아웃으로 Android 텍스트 필드 및 텍스트보기

  16. 16

    iOS8에서 iOS 시뮬레이터와 장치간에 NSNumber에서 BOOL 로의 다른 결과

  17. 17

    서로 다른 레이아웃의 두 구성 요소 사용

  18. 18

    Lubuntu에 다른 레이아웃 추가

  19. 19

    Lubuntu에 다른 레이아웃 추가

  20. 20

    다른 레이아웃 위에 레이아웃 설정

  21. 21

    레이아웃을 다른 레이아웃 내부에 정렬

  22. 22

    플렉스 방향 행과 서로 다른 행 높이가있는 플렉스 그리드 레이아웃

  23. 23

    Android : 한 레이아웃 활동에서 다른 활동으로 전환

  24. 24

    한 활동에서 다른 활동으로 레이아웃 전달

  25. 25

    다른 레이아웃의 맨 아래에 레이아웃을 포함하는 방법

  26. 26

    Android에서 아래 텍스트를 다른 레이아웃으로 나누는 방법

  27. 27

    Android의 상대 레이아웃 내에서 다른 레이아웃 아래에 각 레이아웃을 설정하는 방법

  28. 28

    방향이 다른 범위의 "오른쪽에서 왼쪽으로"순서

  29. 29

    조각 활동에 다른 레이아웃을 동적으로 포함

뜨겁다태그

보관