;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

iOS 15: o meu iPhone vai aguentar? Confira os modelos compatíveis

De Tilt*, em São Paulo

08/09/2021 11h44Atualizada em 12/09/2021 09h43

A Apple confirmou um evento para a próxima terça-feira (14) e as apostas para o lançamento da linha iPhone 13 (nome ainda não oficial) estão altas. Se os rumores se confirmarem, a nova versão do iOS 15, sistema operacional do iPhone, também deve ganhar uma data oficial de lançamento. As chances são bem altas disso acontecer.

Como toda atualização de sistema, alguns modelos de iPhone mais antigos deixam de receber as novidades desenvolvidas pela empresa. Por isso, Tilt destaca a seguir um resumo das principais mudanças e as linhas que serão compatíveis com o iOS 15.

iOS 15

O novo sistema operacional foi apresentado pela Apple em junho deste ano durante a WWDC, conferência da empresa para desenvolvedores. Dias depois, a companhia liberou gratuitamente a versão beta (de testes) para quem quisesse explorar.

O que tem de diferente?

O iOS 15 possui recursos mais avançados e foca em novidades para que seus usuários lidem, por exemplo, com notificações. Existe um modo Foco para evitar distrações e vem com várias melhorias para chamadas de vídeo, tornando o Facetime um concorrente à altura do Zoom e do Google Meets.

A câmera do iPhone também será capaz de detectar textos em uma foto com ajuda de inteligência artificial. E isso funcionará em diferentes idiomas.

Mudanças dentro do aspecto de privacidade também estão previstas. A partir do iOS 15, a Apple começará a pedir o consentimento do usuário para habilitar o recurso de "Anúncios Personalizados", que mostra propagandas na App Store de acordo com dados sobre seus interesses. Até hoje, o recurso já vinha ativado como padrão no iPhone.

Outras novidades:

  • Busca inteligente: a busca interna do iOS conseguirá ser usada a partir de conteúdos detectados dentro de fotografias, além de contar com cards informativos de atores e atrizes, por exemplo.
  • App Saúde: ajudará a monitorar equilíbrio das pessoas e permitirá compartilhamento de informações de saúde com parentes e cuidadores.
  • Privacidade: app Mail terá tecnologia que impede que terceiros saibam se você leu e-mails; novo App Privacy Report mostra como apps usam dados das pessoas.

O sistema irá funcionar em qual iPhone?

*Com matéria de Guilherme Tagiaroli