Hiển thị bàn phím Emoji của hệ thống theo mặc định trên iOS 13


17

Giải pháp

Đây là một giải pháp đầy đủ / giải quyết vấn đề này, vui lòng bỏ phiếu cho câu trả lời của Blld vì đây là thông tin quan trọng cần thiết!

Tiêu đề thay thế để hỗ trợ tìm kiếm

  • Hiển thị bàn phím Emoji làm mặc định cho đối tượng UIKeyInput (trong iOS 13)
  • Buộc iOS 13 hiển thị bàn phím Emoji
  • Đặt UITextInputMode.primaryLanguagebiểu tượng cảm xúc
  • Lập trình đặt bàn phím thành biểu tượng cảm xúc

Trước trả lại UITextInputModevới primaryLanguageđiều đó tương đương "biểu tượng cảm xúc" sẽ mặc định hiển thị bàn phím Emoji (xem hình dưới đây).

Chụp màn hình bàn phím Emoji

Mã ví dụ để trả về "biểu tượng cảm xúc" UITextInputMode.

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}


    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

Chạy mã này trên iOS 12 sẽ đặt bàn phím thành Bàn phím Emoji của hệ thống, nhưng trên iOS 13 thì không ảnh hưởng gì.

Đây có phải là một lỗi được biết đến? Có một cách giải quyết?

Cập nhật

  • Được yêu cầu bởi @Navillus , danh sách đầy đủ của "chế độ đầu vào hoạt động" là; "en-GB", "biểu tượng cảm xúc"
  • Đã thử nghiệm và xác nhận trên; 13.0, 13.1, 13.1.1, 13.1.2 và 13.2 (hạt 1)

Điều thú vị: Tôi đã có thể chạy mã này thành công trên trình giả lập, nhưng không phải trên thiết bị. iOS 13 cho cả hai. Bây giờ tôi đang tò mò.
Marina Aguilar

Làm việc cho tôi trong một mô phỏng quá. @rjstelling Danh sách đầy đủ của activeInputModes trên thiết bị của bạn là gì? Bạn có thể kiểm tra bằng cái này: print (UITextInputMode.activeInputModes.map ({(m) -> String in return m.primaryL Language ?? ""}))
Navillus

@Navillus - câu trả lời trong câu hỏi, "en-GB" và "biểu tượng cảm xúc" của nó
đánh dấu

1
Điều này hiện đã được sửa trong iOS 13.4 / Xcode 11.4
Stephen

Câu trả lời:


9

Tôi đã gửi một radar về điều này cho iOS 13 vì tôi có một ứng dụng song ngữ Nhật / Anh. Một số lĩnh vực là tiếng Nhật và một số tiếng Anh nên rõ ràng việc trình bày đúng loại bàn phím cho người dùng thay vì làm cho chúng lật qua lật lại 20 lần.

Có một cách giải quyết cho vấn đề này và đó là sau khi UIKit gọi 'textInputMode', trong luồng chính bạn có thể làm điều này:

// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
    textField.keyboardType = textField.keyboardType
} 

Điều này buộc bàn phím phải tải lại sau khi trả lời với textInputMode mà bạn muốn. Tôi đã thông báo cho họ về lỗi và cách giải quyết để có hành vi chính xác.

Vì vậy, trong iOS 13.1, lỗi không được sửa, tuy nhiên họ đã chặn cách giải quyết của tôi.

Đẹp. Tôi sẽ không báo cáo bất kỳ lỗi nào cho họ một lần nữa. Thay vào đó nếu tôi tìm thấy một cách giải quyết, tôi sẽ chỉ sử dụng nó.

Vì vậy, có vẻ như bây giờ họ đang âm thầm vô hiệu hóa tính năng này. Và nó là một tính năng, đây thực sự là mục đích của cuộc gọi phương thức này, để tìm hiểu chế độ đầu vào nào sẽ được trình bày cho người dùng.

vẫn hoạt động tốt mặc dù nếu bạn có ngôn ngữ khác và muốn chọn tiếng Anh.

Vì vậy, nếu người dùng của tôi đặt tiếng Nhật làm lựa chọn bàn phím thì tôi có thể buộc bàn phím tiếng Anh lên. Không phải là cách khác. Mọi nỗ lực để có được chế độ nhập liệu tiếng Nhật đều kết thúc bằng bàn phím tiếng Anh.

BIÊN TẬP:

Có một con đường khác mà bạn có thể giải quyết xung quanh vấn đề này, nhưng nó liên quan đến việc phát hiện và sử dụng API nội bộ không đơn giản. Về cơ bản, bạn phải tìm các chức năng được sử dụng để quản lý kết quả của việc nhấn nút toàn cầu. Nếu bạn làm điều đó về cơ bản là bạn đang mô phỏng các vòi của người dùng và nó có nhiều hiệu ứng khác nhau, nghĩa là, bàn phím cũng sẽ được thay đổi cho các ứng dụng khác. Vì vậy, điều đó không được khuyến khích, 100% sẽ thất bại trong việc gửi App Store. Tôi không muốn đăng nó vì kết quả của cách giải quyết cuối cùng của tôi.

Tôi nghĩ rằng không thể hiểu Apple rất dễ dàng. Tất cả những gì tôi biết là:

  1. API không hoạt động như đã xuất bản
  2. nó đã được báo cáo và họ đã không sửa lỗi
  3. kể từ thời điểm báo cáo họ đã phá vỡ (cố ý hay không) cách giải quyết

Vì vậy, cách giải quyết trong tương lai nên được tích trữ cho đến khi ý định của họ rõ ràng và / hoặc họ sửa lỗi này (đó là điều họ nên làm). Chỉ cần thu hồi một phần API mà không xuất bản thay đổi là một lỗi lớn.


Cám ơn vì cái này! Nó đã giúp tôi hiểu điều này hơn một chút. Tôi nghi ngờ họ cố tình chặn cách giải quyết của bạn, điều này cảm thấy giống như một lỗi với tôi. Nếu họ muốn loại bỏ tính năng, họ có thể không dùng nó.
bắt đầu

"Không bao giờ gán cho ác ý được giải thích thỏa đáng bởi sự ngu ngốc."
bắt đầu

Có ai tìm thấy một cách giải quyết khác cho điều này?
shujaat

8

NB: Đảm bảo bạn đã bật bàn phím Emoji.

Đây dường như là một lỗi của iOS 13, công việc xung quanh (đối với các thiết bị, điều này không ảnh hưởng đến Trình mô phỏng) là ghi đè lên thuộc textInputContextIdentifiertính và trả về giá trị không.

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯ 

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}

    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

Cảm ơn blld cho câu trả lời của mình.


1
Tôi có cùng loại vấn đề trong việc hiển thị bảng thập phân tiếng Anh. Ngôn ngữ của ứng dụng của tôi là tiếng Ả Rập và tôi muốn trường văn bản của mình hiển thị bảng thập phân tiếng Anh. Tôi đã thực hiện các bước được đề cập ở trên bằng cách ghi đè các vars và phương thức này. Trong textInputMode, tôi chỉ trả về chế độ "en-US", nhưng nó vẫn hiển thị phần thập phân tiếng Ả Rập trong iOS 13.
shujaat

Không hoạt động với tôi trên iOS 13.2
atereshkov

Tôi có thể xác nhận rằng điều này dường như không còn hoạt động nữa đối với iOS 13.2 ...
Jay Lee

@JayLee Hãy chắc chắn rằng bạn đã bật bàn phím Emoji
khởi động lại vào

7

Bạn cần đặt textinputcontextidentifiertrên textField để iOS biết nơi lưu tùy chỉnhtextInputMode

Nó không được viết trong tài liệu nhưng nó hoạt động.

ref: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier


2
Điều này làm việc cho tôi trên iOS 13. Chỉ cần trả lại "emoji"hoặc ""cho textInputContextIdentifiervào tùy chỉnh của tôi UITextFieldhiển thị bàn phím Emoji (khi kết hợp với các textInputModeghi đè trong câu hỏi). Cảm ơn các mẹo về các tài liệu ẩn. 👍
Baza207

Không hoạt động khi chúng tôi muốn thực thi bảng thập phân tiếng Anh cho UITextField khi bản địa hóa của ứng dụng bằng tiếng Ả Rập.
shujaat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.