2017-09-27 1 views
5

나는 아이폰 OS (11) 시뮬레이터 내부 JSQMessageViewController의 신속한 예를 시도했다. 다음은 결과입니다 : 내가 안전 영역 여백을 사용하고 도구 모음의 제약 조건을 수정 시도 screenshotjsqmessageviewcontroller의 ios11 도구 모음

하지만 차이는 아직 없다. 툴바가 UIWindow (UITextEffectsWindow) 외부에있는 것 같습니다. 어떤 해결책이 있습니까?

+0

미안하지만, 당신이 모든을 통해 달성하려고하는 무엇을 요구하는지 매우 분명하지 않다? –

+0

스크린 샷에서 볼 수 있듯이 키보드는 안전 영역 가이드를 따르지 않고 iphone X 자극기 하단에 있습니다. –

+0

JSQ의 버그 일 가능성이 있습니다. 알고 계시 겠지만, 더 이상 사용되지 않습니다. 그것을 대체하기위한 노력은 https://github.com/MessageKit/MessageKit에서 계속됩니다. –

답변

1

얘들 아 나는 그것을 알아 낸! JSQMessagesInputToolbar.m에 다음 코드를 입력하기 만하면됩니다. 입력 도구 모음이 자체 창에 배치 된 것 같습니다. 별도로 창에 액세스해야합니다.

-(void) didMoveToWindow{ 
[super didMoveToWindow]; 
if (@available(iOS 11.0, *)) { 
    [[self bottomAnchor] constraintLessThanOrEqualToSystemSpacingBelowAnchor:self.window.safeAreaLayoutGuide.bottomAnchor multiplier:1.0].active = YES; 
    } 
} 
+1

당신은 window.safeAreaLayoutGuide에 대해 확인해야합니다. nil coz가 아닙니다. 위의 코드를 사용하면 앱이 닫히고 화면을 닫으므로 조건을 추가하면 nil이 건너 뛸지 검사 할 수 있습니다. –

1

같은 문제가 있습니다. JSQMessageViewController를 안전한 영역이 설정된 viewController의 자식 뷰로 추가하여이를 해결하려고합니다.

존재 MyJSQMessageViewController JSQMessagesViewController의 서브 클래스 :

self.myJSQMessageViewController = [[MyJSQMessageViewController alloc] init]; 
[self addChildViewController:self.myJSQMessageViewController]; 
[self.view addSubview:self.myJSQMessageViewController.view]; 
[self.myJSQMessageViewController didMoveToParentViewController:self]; 
if (@available(iOS 11.0, *)) { 
    self.myJSQMessageViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
    [NSLayoutConstraint activateConstraints:@[ [self.myJSQMessageViewController.view.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], [self.myJSQMessageViewController.view.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], [self.myJSQMessageViewController.view.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], [self.myJSQMessageViewController.view.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] ]]; 
} 

적합하지 솔루션 그러나 적어도 당신이 iOS11 안전 영역 내부의 입력 도구 모음을해야합니다 ... 나쁜 소식은 늘 비 안전 영역에 표시 할 것을 입력 도구 모음입니다 그래서 그래픽으로 늘

enter image description here

+0

입력 textview가 첫 번째 응답자가 될 때 collectionView도 조금 아래로 스크롤합니까? –

+0

아니요. 알아 차릴 수 없습니다. (물론 나는 에뮬레이터를 테스트했다.) https://imgur.com/PqLx0Mq에서 작은 비디오를 볼 수있다 –

3

이 답변은 JSQMessagesVie을 기반으로합니다 (이미지 참조) 기본 도구 모음처럼 wController 버전 7.3.

참고 : 아래 코드에는 컴파일러 경고를 피하기위한 지저분한 pragma 지시문이 포함되어 있습니다. 코드 자체는 실제로 pragma를 넘어서면 아주 간단합니다.

이 여전히 소프트웨어 키보드가 제시 할 때 도구 모음을 이동할 수 있도록하면서 문제를 해결할 것으로 보인다. 내 JSQMessagesViewController 서브 클래스에 다음 코드를 추가 :

- (void)viewDidLoad { 
    [...] 

    // To keep the toolbar inside the safe area on iPhone X, we need to install a new constraint that has higher priority than the one 
    // JSQMessagesViewController manipulates when adjusting for the keyboard. The `toolbarBottomLayoutGuide` is a private property in our 
    // superclass, so it's not straightforward to access it... 
    if (@available(iOS 11.0, *)) { 
    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Wundeclared-selector" 
     NSLayoutConstraint *constraint = [self performSelector:@selector(toolbarBottomLayoutGuide)]; 
    #pragma clang diagnostic pop 
     constraint.priority = 999; 
     [self.inputToolbar.bottomAnchor constraintLessThanOrEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor].active = YES; 
} 

편집 : 스위프트 사용자의는 다음과 같은 트릭을 사용하면 개인 objc 메소드를 호출하도록해야 : 코드 :

let constraint = perform(Selector(("toolbarBottomLayoutGuide"))).takeUnretainedValue() as! NSLayoutConstraint 
constraint.priority = 999 

편집 이 새 제약 조건이 추가 된 후에는 collectionView의 contentInset을 조정하는 컨트롤이 호출되지 않으므로 채팅보기에 화면에 맞는 것보다 많은 메시지가 포함되어 있으면 마지막 메시지 거품이 입력 도구 모음에 의해 가려집니다. 나는 viewDidAppear viewDidLayoutSubviews에 다음 코드를 추가하여 업데이트 인 세트를 보장함으로써이 문제를 해결 :

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wundeclared-selector" 
[self performSelector:@selector(jsq_updateCollectionViewInsets)]; 
#pragma clang diagnostic pop 
+0

어디에서'toolbarBottomLayoutGuide'를 얻을 수 있는지 이해할 수 없다 ... – Tulleb

+0

toolbarBottomLayoutGuide는 JSQMessagesViewController에 정의되어있다. 나는 서브 클래 싱 중입니다. 그것은 .m 파일에 정의되어있어 구현에서 볼 수 없기 때문에 performSelector를 사용하고 pragma 지시문을 추가하는 이유입니다. –

+0

우리는 다른 가지에 대해 이야기하고 있다고 생각합니다. 나는 JSQ로부터 최신'개발 '커밋을 위해 노력 중이다. [제거 된 것으로 보입니다.] (https://imgur.com/Cj8q6sk) – Tulleb

1

나는 최신 develop 분기 커밋 JSQ에 따라 고정 포크를 제안하고있다.

그것은 didMoveToWindow 용액을 사용한다. 이상적이 아니지만 inputAccessoryView의 안전 영역 레이아웃 가이드 첨부 파일 또는 다른 개선 사항에 대한 Apple의 답변을 기다리는 동안 시도해 볼 가치는 없습니다.

당신은 이전 JSQ 라인을 대체하여 Podfile이를 추가 할 수 있습니다

pod 'JSQMessagesViewController', :git => 'https://github.com/Tulleb/JSQMessagesViewController.git', :branch => 'develop', :inhibit_warnings => true