Adaptação de novo recurso do iOS 13

1. KVC privado

[self setValue:baseTabBar forKey:@"tabBar"]; //正常

[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];///崩溃
[_textField setValue:[UIFont systemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"];///崩溃

_textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"姓名" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName:[UIColor redColor]}]; ///新的实现
复制代码

Compilar no Xcode10 não causará problemas, mas compilar no Xcode11 irá travar. E o - (void)setValue:(nullable id)value forKey:(NSString *)keymétodo está ok, ele - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPathirá travar

2. O problema do presentViewController

Esta situação ocorre principalmente porque não definimos o tipo necessário para uma propriedade em UIViewController, a saber modalPresentationStyle (esta propriedade é o estilo que o controlador usará na visualização modal). No iOS13, o padrão de modalPresentationStyle é alterado para UIModalPresentationAutomatic, e o padrão é UIModalPresentationFullScreen antes.

Isso não é afetado pela versão do Xcode, desde que o sistema iOS13 não defina explicitamente o modalPresentationStyle, haverá esse problema

3. LaunchImage a ser abandonado

Desde o iOS 8, a Apple introduziu o LaunchScreen. Podemos definir o LaunchScreen como a página de inicialização. Claro, agora você também pode usar LaunchImage para definir a imagem de inicialização. No entanto, o uso do LaunchImage exige que forneçamos imagens de inicialização de vários tamanhos de tela para se adaptar a vários dispositivos. Com o tamanho crescente dos dispositivos Apple, esse método obviamente não é flexível o suficiente. Com LaunchScreen, a situação se tornará muito simples.O LaunchScreen suporta AutoLayout + SizeClass, por isso é fácil de se adaptar a várias telas. Atenção ⚠️, a partir de abril de 2020, todos os aplicativos que usam o iOS13 SDK terão que fornecer LaunchScreen, e LaunchImage em breve sairá do estágio de história

4. Modo escuro

princípio

1. Crie dois padrões de estilos do mesmo recurso. O sistema obtém automaticamente os recursos do estilo de acordo com o estilo atualmente selecionado

2. Cada vez que o sistema atualiza o estilo, o aplicativo irá chamar todos os elementos existentes para chamar os métodos de redesenho correspondentes para redesenhar a visualização, e você pode fazer as alterações correspondentes nos métodos correspondentes

Adaptação de arquivo de recurso

1. Crie um arquivo de Ativos (ou em um arquivo de Ativos existente) 2. Crie um novo arquivo de recurso de imagem (ou arquivo de recurso de cor ou outro arquivo de recurso) 3. Selecione o arquivo de recurso e abra Xcode -> Exibir -> Inspetores- > Exibir Inspetores de Atributos (ou Opção + Comando + 4), altere a opção Aparências para Qualquer, Escuro 4. Após executar a terceira etapa, o arquivo de recursos terá várias caixas de contêiner, ou seja, Qualquer Aparência e Aparência Escura. Aplicado à condição padrão (não especificado) e condição de destaque (claro), aparência escura se aplica ao modo escuro (escuro) 5. Quando o código é executado por padrão, ele pode ser usado normalmente por nome, e o sistema obterá automaticamente o arquivo de recurso correspondente de acordo com o modo atual

Nota

Depois que vários arquivos de recursos no mesmo projeto são empacotados, um arquivo Assets.car será gerado, portanto, certifique-se de que os nomes dos arquivos de recursos em recursos não podem ser os mesmos

UIView

traitCollectionDidChange(_:)
layoutSubviews()
draw(_:)
updateConstraints()
tintColorDidChange()
复制代码

UIViewController

traitCollectionDidChange(_:)
updateViewConstraints()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
复制代码

UIPresentationController

traitCollectionDidChange(_:)
containerViewWillLayoutSubviews()
containerViewDidLayoutSubviews()
复制代码

Desative o modo escuro globalmente

  • Método 1: Configure o arquivo plist: No arquivo Info.plist, adicione o nome da chave UIUserInterfaceStyle como Estilo de Interface do Usuário e o valor String, e defina o valor da chave UIUserInterfaceStyle como Light

Durante o desenvolvimento, se o controle do sistema usado (como a cor de fundo da célula e tableview) não for definido com uma cor de fundo (ou for transparente), após entrar no modo escuro, a cor de fundo do controle se tornará preta.

Pode ser configurado para cada página, é claro, também pode ser configurado como um todo.Geralmente, nosso APP fica em uma janela, então configure a janela no APP como um todo

  • Método 2: Codifique para desligar o modo escuro para forçar o modo escuro desligado
#if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
if(@available(iOS 13.0,*)){
self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
#endif
复制代码

Uma única interface não segue o modo escuro

  1. Ambos UIViewController e UIView têm um novo atributo overrideUserInterfaceStyle

  2. Se overrideUserInterfaceStyle é definido para o modo correspondente, o elemento e seus subelementos são forçados a serem impedidos de serem exibidos no modo definido, sem alterar o modo do sistema

    1. Definir esta propriedade de ViewController afetará a visão e os controladores de visão filho do controlador de visão para adotar este estilo
    2. Definir esta propriedade de vista afetará a vista e todas as suas subvisualizações para adotar este estilo
    3. Definir esta propriedade de Window afetará o estilo de todo o conteúdo da janela, incluindo o controlador de visualização raiz e todos os controladores de apresentação que exibem conteúdo na janela (UIPresentationController)

Modo escuro adaptado para iOS: www.jianshu.com/p/7925bd51d ...

5. Aumente a permissão para usar sempre o Bluetooth

CBCentralManager, antes do iOS13, pode ser usado diretamente ao usar o Bluetooth, sem solicitação de permissão, após o iOS13, ele irá avisar quando você usá-lo novamente. Aumento em info.plist

<key>NSBluetoothAlwaysUsageDescription</key> 
<string>我们要一直使用您的蓝牙,具体做什么别问我</string>`
复制代码

6. Use MJExtension para lidar com a diferença de NSNull

Isso fará com que o Crash converta diretamente o dicionário de dados do lado do servidor para o modelo. Se os dados fornecidos pelo servidor forem NSNull, mj_JSONObject, entre os quais as propriedades obtidas pelo método class_copyPropertyList, há uma coisa do tipo EFSQLBinding, e a propriedade O número não é preciso, então não há como. Só posso reescrever este método. Quando o componente não é atualizado, escrevi um método para swizzling para transformá-lo diretamente em nulo quando encontrar NSNull.

7. O método de medição da altura do conteúdo da página em WKWebView foi alterado

Antes do iOS 13, document.body.scrollHeight no iOS 13, document.documentElement.scrollHeight difere em 55. Deve ser que a altura definida pelo navegador tenha mudado.

8. Youmeng news push, obtenha a adaptação do deviceToken

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
   if (![deviceToken isKindOfClass:[NSData class]]) return;
      const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
      NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),ntohl(tokenBytes[6]),ntohl(tokenBytes[7])];
      pushDeviceToken = hexToken;
      NSLog(@"deviceToken:%@",hexToken);
}
复制代码

9. StatusBar é diferente da versão anterior

Atualmente, a barra de status também adicionou um modo, dos dois para três anteriores, entre os quais o padrão é alterado do conteúdo preto anterior para selecionar automaticamente o display atual lightContent ou darkContent de acordo com o modo do sistema

10. Travamento causado por anzol ( github.com/facebook/fi ...

 

Acho que você gosta

Origin blog.csdn.net/wangletiancsdn/article/details/100776517
Recomendado
Clasificación