Unit Test로 화면 크기 맞추면 망가지는 Auto Layout

5568 단어 AutoLayoutiOS

TL;DR


나는 프로그램 라이브러리를 썼다.
https://github.com/ypresto/AutoLayoutLint
이걸 넣으면 ↓처럼 모든 ViewController가 고장났는지 검사합니다.

설정


iOS 8.0+ 항목에서 사용할 수 있습니다.
캐럿 허지나 코코앱즈로 오토LayoutLine설치하다.을 이 느낌의 테스트에 추가하면 done!
(화면 크기는 지원하는 부분만 남겨서 삭제하거나 아이패드 해상도를 높이십시오.)
@import AutoLayoutLint;

@interface YourAutoLayoutLintTests : PSTAutoLayoutLintTestCase

@end

@implementation YourAutoLayoutLintTests

+ (NSArray<NSValue *> *)screenSizes
{
    return @[
        [self valueWithWidth:320 height:480], // iPhone 4S
        [self valueWithWidth:480 height:320],
        [self valueWithWidth:320 height:568], // iPhone 5, 5S
        [self valueWithWidth:568 height:320],
        [self valueWithWidth:375 height:667], // iPhone 6, 6S
        [self valueWithWidth:667 height:375],
        [self valueWithWidth:414 height:736], // iPhone 6 Plus, 6S Plus
        [self valueWithWidth:736 height:414],
    ];
}

- (void)testDummy
{
    // NOTE: Workaround for Xcode bug.
    // Refer: https://github.com/ypresto/AutoLayoutLint/issues/1
}

@end

Auto Layout의 과제


Auto Layout은 다양한 화면 크기에 쉽게 대응할 수 있어 편리하지만, 한편으로는 컨스트럭션을 잘 디자인하지 않으면 화면 크기가 바뀌면'Unable to simultansly satisfraints'라고 불리며 손상된다.
(디자인 쪽도 →) http://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03
팀 내에서도 실제 사이즈 변화로 콘스트레인지가 파손될 수 있지만, 심사 등을 통해 이를 발견하고 수정하기 위해서는 콘스트레인지 디자인을 제대로 파악하지 못하면 어렵다는 점이 과제가 됐다.특히 이번에는 아이폰6(S)/6(S) 플러스 해상도에 대응하기 위해 많은 뷰 컨트롤러에 오토 Layout의 신규 투입과 수정을 단행해 망가진 곳이 없는지 불안해하고 있다.

그건 privete API로 할 수 있어요.


그래서 최소한의 검사를 자동화할 수 있을까 하는 생각을 했다.
팀원misplaced="YES"은grep에서xml(Interface Builder에서 노란색 삼각형을 띤 상태)을 발견했지만 이전에는 있었을 것ambiguous="YES"(적환출고장태)은xml에서 나타나지 않았다.
한편, Auto Layout이 망가진 것은 인터페이스 Builder에 표시된 화면과 크기가 다른 경우가 대부분이기 때문에 어떻게든 찾아내려면 사실상 Layout Engine을 회전하는 수밖에 없다고 생각한다.
따라서 다양한 화면 크기를 변경해 실제 레이아웃 처리를 수행하고 Auto Layout에서 경고를 보낼 때 Test Failure로 분할된 Unit Test 라이브러리를 호출해 봅니다.
※ 실제viewController의viewDidLoad가 맞으면 통신 같은 경우가 있을 수 있으므로viewDidLoad도 비대해져stub로 변할 수 있습니다.

알려진 제한 사항


UItableView라든지 UICollectionView라든지 역동적인 요소가 강하기 때문에 확인은 안되지만 데이터 소스를 적절히 매립하면 어떻게 되는지 방법을 강구하고 있습니다.
UINaviation Controller push가 하는 것이 아니라 nav/tab bar의 높이를 모방하는 것이 아니기 때문에 세로 방향의 검사가 다소 불완전하다.이것은 대책을 고려한다.
그리고comparensistance나contenthuggingprority 등에서 발생하는ambiguous 상태도 발견하고 싶지만 아직 지원되지 않습니다.priority에 관한 일은 잠시 후에 기사를 쓰고 싶습니다.

좋은 웹페이지 즐겨찾기