2017-09-14 14 views
0

iMessage Extension에 매우 기본적인보기 컨트롤러가 있습니다. (확장 된 뷰). Compact view에서 키보드 입력을 할 수 없다는 것을 알고 있습니다 ...iMessage 확장 : Child View Controller의 UITextView, 스크롤 동작에 여러 가지 문제가 있습니다.

UITextView는 그 위와 아래에있는 요소에 구속됩니다. 높이와 너비가 설정되어 있습니다. 제약 조건은 모두 순서대로 이루어지며 깨지지 않습니다.

인터페이스 빌더의 textview에있는 모든 옵션이 기본값으로 남았습니다.

다음과 같은 문제는 UITextView 발생 : 내가 편집을 시작하면 커서가 거의 볼 수

  1. . (필드의 아래쪽에, 반은 수직으로 자른다).

  2. 첫 글자를 입력하면 커서가 텍스트보기의 수직 가운데로 이동합니다.

  3. 새 줄과 문자를 놓으면 커서가 다시 내려갑니다.

  4. 그런 다음 후속 문자를 입력하면 커서가 수직 중심으로 다시 이동합니다. 그리고 다른 모든 문자는 전체 텍스트보기를 맨 아래로 다시 스크롤합니다. 그래서이 모든 이상한 동작을 모든 키 스트로크에서 위아래로 바운스하게 만듭니다.

  5. 오른쪽의 스크롤 막대 시각적 힌트가 스크롤 할 때 텍스트보기의 적절한 높이를 반영하지 않습니다. (스크롤 바는 절반 길을 간다 - 텍스트 뷰의 높이.)

내가 UITextView 기본적으로이 같은 일을 기대 :

  1. 커서가의 TOP으로 이동한다

    텍스트보기 (활성화되었을 때) 및 편집.

  2. 새 줄 뒤에 키를 입력 할 때 텍스트보기가 건너 뛰지 않아야합니다.

  3. 세로 스크롤 막대 표시기는 텍스트 필드의 전체 범위를 표시해야하며 절반은 표시하지 않아야합니다.

분명히 텍스트보기 내부의 스크롤보기는 사물의 크기를 알아내는 데 문제가 있습니다.

누구나 알고 있겠습니까? iMessage와 관련된 문제이거나 다른 사람도 iMessage 외부에서이 문제를 겪고 있는지, 수정 방법은 알고 계십니까? 문제의 enter image description here

비디오 데모 :

내 IB 제약 (두 번째 아래로보기 텍스트보기이다) https://youtu.be/1bkvHnkXLWM

업데이트 : 안에 내보기 컨트롤러를 포함하는 아이 뷰 컨트롤러를 사용하고 루트 컨트롤러. 빈 Hello World 응용 프로그램을 시도하고 UITextView 기본적으로 정상적으로 작동합니다. 따라서이 문제는 Child View Controller를 포함하는 방식과 관련이 있습니다.

- (void)showViewController:(UIViewController*)vcToShow isPop:(BOOL)isPop 
{ 
    NSLog(@"Presenting Controller: %@", vcToShow); 
    [self.activeVC willMoveToParentViewController:nil]; 
    [self addChildViewController:vcToShow]; 

    vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO; 
    vcToShow.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    [self.rootView addControls:@[vcToShow.view] 
    align:VerticalAlignStretchToFullHeight]; 

    UIViewController* currentVC = self.activeVC; 
    self.activeVC = vcToShow; 
    vcToShow.view.alpha = 0.0f; 

    [self transitionFromViewController:currentVC 
     toViewController:vcToShow 
     duration:0.3 
     options:UIViewAnimationOptionTransitionNone 
     animations:^{ 

      vcToShow.view.alpha = 1.0f; 
     } 
     completion:^(BOOL finished) { 
      [currentVC removeFromParentViewController]; 
      [vcToShow didMoveToParentViewController:self]; 
      [self updateScreenState]; 

      if (isPop) { 
       [self removeReferenceToController:currentVC]; 
      } 
     }]; 
} 
+0

을하지만, 라인 수 있습니다 :' vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO;'? 나중에 자동 크기 조정 마스크를 사용하고 있는데, 'YES'로 설정하지 않아도됩니까? –

+0

안녕하세요. 변경 translateAutoresizingMaskIntoConstraints 예, UITextView 영향을주지 않았다. 감사. – Alex

답변

1

나는 해결책을 가지고 :

내가 내 자식보기 컨트롤러를 포함하는 사용하고 코드입니다.

Interface Builder를 사용하여 UITextView를 배치하는 대신 ViewDidAppear 후에 만 ​​UITextView를 만들고 배치하기 위해 내 자신의 프로그래밍 방식 제약 생성 메서드를 사용했습니다.

내 생각에 인터페이스 빌더가 자식 VC의 뷰를 렌더링 할 때 UITextView의 내부 스크롤 뷰가 필요하다는 것이 모든 것이 채워지지 않았다고 의심된다. 따라서 스크롤 뷰는 잘못된 치수 값으로 초기화되므로 스크롤과 관련된 모든 것에 결함이 발생합니다. 프로그래밍 방식으로 (Child VC에서) viewDidAppear의 모든 작업을 수행 한 후에는 텍스트 뷰가 올바르게 스크롤되고 커서는 항상 처음부터 예상대로 작동합니다.

업데이트 코드 :

  1. 완전히 인터페이스 빌더에서 UITextView했다.
  2. 프로그래밍 (viewDidAppear에서 호출)이 추가 : 단지 추측

    self.textView = [[UITextView alloc] init]; 
    self.textView.translatesAutoresizingMaskIntoConstraints = NO; 
    
    CGFloat topPadding = self.instructionLabel.frame.origin.y + self.instructionLabel.frame.size.height + TEXT_VIEW_TOP_PADDING; 
    
    // This custom method generates Visual Constraint format for me 
    // so i don't have to write manual individual constraint syntax. 
    [self.rootView addControls:@[self.textView] 
        align:VerticalAlignTop 
        withHeight:TEXT_VIEW_HEIGHT 
        verticalPadding: 0 
        horizontalPadding: 20 
        topPadding: topPadding];