मैं iPhone पर एक अभिविन्यास परिवर्तन पर वेब ऐप के पैमाने / ज़ूम को कैसे रीसेट कर सकता हूं?


96

जब मैं पोर्ट्रेट मोड में अपना ऐप शुरू करता हूं, तो यह ठीक काम करता है। फिर मैं परिदृश्य में घूमता हूं और इसे बढ़ाया जाता है। लैंडस्केप मोड के लिए सही ढंग से स्केल करने के लिए मुझे दो बार किसी चीज़ पर डबल टैप करना है, पहले सभी तरह से (सामान्य डबल टैप व्यवहार) ज़ूम करने के लिए और फिर से सभी तरह से ज़ूम आउट करने के लिए (फिर से, सामान्य डबल टैप व्यवहार) । जब यह बाहर निकलता है, तो यह परिदृश्य मोड के लिए सही नए पैमाने पर निकलता है।

चित्र पर वापस स्विच करना अधिक लगातार काम करना प्रतीत होता है; यही है, यह ज़ूम को संभालता है ताकि स्केल सही हो जब अभिविन्यास वापस पोर्ट्रेट में बदल जाए।

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या यह बग है? या अगर यह कुछ है जो जावास्क्रिप्ट के साथ तय किया जा सकता है?

व्यूपोर्ट मेटा सामग्री के साथ, मैं 1.0 के लिए प्रारंभिक-स्केल सेट कर रहा हूं और मैं न्यूनतम या अधिकतम स्केल सेट नहीं कर रहा हूं (और न ही मैं चाहता हूं)। मैं डिवाइस-चौड़ाई की चौड़ाई सेट कर रहा हूं।

कोई विचार? मुझे पता है कि बहुत से लोग इसका समाधान करने के लिए आभारी होंगे क्योंकि यह एक निरंतर समस्या है।


1
एक सही समाधान: कोई जावास्क्रिप्ट! stackoverflow.com/a/8727440/805787
Steeven

जवाबों:


89

जेरेमी कीथ ( @adactio ) ने अपने ब्लॉग ओरिएंटेशन और स्केल पर इसके लिए एक अच्छा समाधान निकाला है

मार्कअप में अधिकतम-स्केल सेट न करके मार्कअप को स्केलेबल रखें।

<meta name="viewport" content="width=device-width, initial-scale=1">

जब आप इस स्क्रिप्ट के साथ दोबारा स्केलेबिलिटी की अनुमति देते हैं, तब तक जेस्टस्क्रिप्ट के साथ लोड पर जेस्टस्क्रिप्ट के साथ स्केलेबिलिटी को अक्षम करें।

if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0';
        document.body.addEventListener('gesturestart', function () {
            viewportmeta.content = 'width=device-width, minimum-scale=0.25, maximum-scale=1.6';
        }, false);
    }
}

अपडेट 22-12-2014:
एक iPad 1 पर यह काम नहीं करता, यह ईवेंटलिस्ट पर विफल रहता है। मैंने पाया है कि .bodyफिक्सिंग को हटाने कि:

document.addEventListener('gesturestart', function() { /* */ });

4
निश्चित रूप से यह ज़ूम को अक्षम करने से बेहतर है ?! सबसे अच्छा फिक्स मैंने अभी तक पाया है :)
danwellman

हम्म, यह अभी भी ज़ूम करने की क्षमता को अक्षम करता है। क्या किसी के पास एक सरल उपाय है जो ऐसा नहीं करता है?
ब्रैड स्वेरफेडर

यह काम करता है, हालांकि मैंने देखा कि अगर मैं चुटकी-ज़ूम के इशारे का उपयोग करता हूं और फिर स्क्रीन को घुमाता हूं तो मुद्दा फिर से शुरू होता है। निश्चित नहीं है कि इसे कैसे ठीक किया जाए।
नीलेश

3
यह काम करता हैं। हालाँकि, मैंने देखा है कि ज़ूम करने के लिए उपयोगकर्ता को दो बार खुला चुटकी लेना होगा। मैं यह अनुमान लगा रहा हूं क्योंकि maximum-scale=1.0इशारे के शुरू होने के बाद प्रभाव में रहता है। क्या इसको ठीक करने का कोई तरीका है?
लैंडोनश्रोप

3
यह 2 कारणों से काम नहीं करता है: 1) यह जेस्चरस्टार्ट नंबर 1 को निष्क्रिय करता है, जिससे उपयोगकर्ता को दो बार इशारे करने की आवश्यकता होती है। 2) यह उपयोगकर्ता के पहले इशारे को दोगुना करने के बाद टूट जाता है, इसलिए यह वास्तव में केवल तभी काम करता है जब उपयोगकर्ता कभी भी इशारों को न करे। - सबको नीचे एंड्रयू एशबैकर के समाधान को देखना चाहिए। यह सचमुच काम करता है।
tmsimont 21

18

स्कॉट Jehl एक शानदार समाधान है कि अभिविन्यास अभिविन्यास परिवर्तन के लिए accelerometer का उपयोग करता है के साथ आया था। यह समाधान बहुत संवेदनशील है और ज़ूम इशारों के साथ हस्तक्षेप नहीं करता है।

https://github.com/scottjehl/iOS-Orientationchange-Fix

यह कैसे काम करता है: यह फिक्स डिवाइस के एक्सेलेरोमीटर को सुनकर यह अनुमान लगाने के लिए काम करता है कि अभिविन्यास परिवर्तन कब होने वाला है। जब यह एक अभिविन्यास परिवर्तन को आसन्न करता है, तो स्क्रिप्ट उपयोगकर्ता को ज़ूम करने में अक्षम करता है, जिससे ओरिएंटेशन परिवर्तन ठीक से अक्षम हो जाता है, ज़ूमिंग अक्षम होने के साथ। एक बार डिवाइस के ईमानदार होने के बाद या उसके उन्मुखीकरण में बदलाव के बाद स्क्रिप्ट फिर से ज़ूम हो जाती है। इस तरह, पेज के उपयोग के दौरान उपयोगकर्ता ज़ूमिंग कभी अक्षम नहीं होता है।

न्यूनतम स्रोत:

/*! A fix for the iOS orientationchange zoom bug. Script by @scottjehl, rebound by @wilto.MIT License.*/(function(m){if(!(/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1)){return}var l=m.document;if(!l.querySelector){return}var n=l.querySelector("meta[name=viewport]"),a=n&&n.getAttribute("content"),k=a+",maximum-scale=1",d=a+",maximum-scale=10",g=true,j,i,h,c;if(!n){return}function f(){n.setAttribute("content",d);g=true}function b(){n.setAttribute("content",k);g=false}function e(o){c=o.accelerationIncludingGravity;j=Math.abs(c.x);i=Math.abs(c.y);h=Math.abs(c.z);if(!m.orientation&&(j>7||((h>6&&i<8||h<8&&i>6)&&j>5))){if(g){b()}}else{if(!g){f()}}}m.addEventListener("orientationchange",f,false);m.addEventListener("devicemotion",e,false)})(this);

अच्छा! एक सुरुचिपूर्ण समाधान की तरह दिखता है।
एलिजाबेथ

1
यह स्वीकृत उत्तर होना चाहिए !!!! काश मैंने ऊपर के समाधानों पर एक घंटा बर्बाद करने से पहले यह देखा :)
tmsimont

1
आगे के परीक्षण के बाद यह एक अविश्वसनीय समाधान की तरह है :( यह असंगत है, और कोड के माध्यम से देखने के बाद मैं देख सकता हूं ... परिभाषित किए गए आंदोलन की "सीमा" हमेशा तक नहीं पहुंची है, खासकर यदि आप आईपैड को पकड़े हुए हैं घूर्णन करते समय कोण
tmsimont

रोटेशन लॉक का उपयोग करने वाले किसी भी व्यक्ति के लिए बुरा परिणाम हो सकता है ... वे फोन को एक निश्चित कोण पर पकड़ सकते हैं और ज़ूम करने की क्षमता खो सकते हैं - उपयोगकर्ता को पता नहीं क्यों होगा
1owk3y

14

मेरे पास एक ही समस्या थी, और मेरे लिए अधिकतम-स्केल = 1.0 निर्धारित करना।

संपादित करें: जैसा कि टिप्पणियों में उल्लेख किया गया है कि उपयोगकर्ता ज़ूम को छोड़कर करता है जब सामग्री चौड़ाई-रिज़ॉल्यूशन से अधिक हो जाती है। जैसा कि उल्लेख किया गया है, यह बुद्धिमान नहीं हो सकता है। यह कुछ मामलों में वांछित भी हो सकता है।

व्यूपोर्ट कोड:

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0;">

अच्छा समाधान है। ओरिएंटेशन परिवर्तनों के माध्यम से पृष्ठ को निरंतर ज़ूम स्तर (डिवाइस की चौड़ाई के सापेक्ष) पर रखते हुए एक अच्छा काम करता है। इसे साझा करने के लिए धन्यवाद!
ल्यूक स्टीवेन्सन

17
नकारात्मक पक्ष यह है कि अक्षम उपयोगकर्ता आपकी साइट पर ज़ूम नहीं कर सकते हैं!
जेस जैकब्स

मैंने देखा कि इन सभी तरीकों से मीडिया-क्वेरी आधारित CSS को नई डिवाइस की चौड़ाई को ठीक से पंजीकृत करने से रोका जा सकता है (उदा: @मीडिया सभी और (अधिकतम-चौड़ाई: 479px)
meavers

2
उपयोगकर्ता ज़ूम को मारना बहुत बुरा विचार है। नीचे एंड्रयू Ashbacher का समाधान देखें
tmsimont

IPhone के बारे में निश्चित नहीं है, लेकिन iPad पर यह समस्या हल नहीं होती है, यह केवल उपयोगकर्ता को मैन्युअल रूप से ज़ूम आउट करने में सक्षम होने से रोकता है जब ब्राउज़र अभिविन्यास परिवर्तन पर बदल जाता है।
अलेजो

3

यदि आपके पास व्यूपोर्ट में चौड़ाई सेट है:

<meta name = "viewport" content = "width=device-width; initial-scale=1.0;
 maximum-scale=1.0;" />

और फिर अभिविन्यास को बदल दें यह बेतरतीब ढंग से कभी-कभी ज़ूम इन करेगा (विशेषकर यदि आप स्क्रीन पर खींच रहे हैं) इसे ठीक करने के लिए यहां एक चौड़ाई सेट न करें:

<meta id="viewport" name="viewport" content="initial-scale=1.0; user-scalable=0;
minimum-scale=1.0; maximum-scale=1.0" />

यह ज़ूम को ठीक करता है जो कुछ भी होता है, आप या तो window.onorientationchange घटना का उपयोग कर सकते हैं या यदि आप चाहते हैं कि यह प्लेटफ़ॉर्म इंडिपेंडेंट (परीक्षण के लिए काम करने वाला) window.innerWidth विधि हो।


1

MobileSafari ऑब्जेक्ट orientationchangeपर ईवेंट का समर्थन करता है window। दुर्भाग्य से वहाँ जावास्क्रिप्ट के माध्यम से सीधे ज़ूम को नियंत्रित करने का एक तरीका नहीं लगता है। शायद आप उस metaटैग को गतिशील रूप से लिख / बदल सकते हैं जो व्यूपोर्ट को नियंत्रित करता है - लेकिन मुझे संदेह है कि यह काम करेगा, यह केवल पृष्ठ की प्रारंभिक स्थिति को प्रभावित करता है। शायद आप सीएसएस का उपयोग करके वास्तव में अपनी सामग्री का आकार बदलने के लिए इस घटना का उपयोग कर सकते हैं। सौभाग्य!


3
धन्यवाद! हां, मैंने डायनामिक रूप से मेटा टैग व्यूपोर्ट मूल्यों को बदलने की कोशिश की और इसने कुछ नहीं किया। यह मुझे लगता है कि यदि आप लैंडस्केप में घूमते हैं, तो आप चाहते हैं कि पैमाने को बनाए रखने के लिए इसे सही ढंग से ज़ूम करें ताकि पेज सफारी विंडो में फिट हो जाए। यह मुझे बहुत अजीब लगता है कि यह डिफ़ॉल्ट व्यवहार नहीं है!
एलिजाबेथ

1

मैंने एक लैंडस्केप / पोर्ट्रेट लेआउट का एक कार्यशील डेमो बनाया, लेकिन जावास्क्रिप्ट के बिना काम करने के लिए ज़ूम को अक्षम किया जाना चाहिए:

http://matthewjamestaylor.com/blog/ipad-layout-with-landscape-portrait-modes


1

मैं अपनी परियोजना में इस फ़ंक्शन का उपयोग कर रहा हूं।

function changeViewPort(key, val) {
    var reg = new RegExp(key, "i"), oldval = document.querySelector('meta[name="viewport"]').content;
    var newval = reg.test(oldval) ? oldval.split(/,\s*/).map(function(v){ return reg.test(v) ? key+"="+val : v; }).join(", ") : oldval+= ", "+key+"="+val ;
    document.querySelector('meta[name="viewport"]').content = newval;
}

तो बस addEventListener:

if( /iPad|iPhone|iPod|Android/i.test(navigator.userAgent) ){
    window.addEventListener("orientationchange", function() { 
        changeViewPort("maximum-scale", 1);
        changeViewPort("maximum-scale", 10);
    }
}

0

मुझे मूल iOS ज़ूम को अक्षम करके, और बजाय जावास्क्रिप्ट में ज़ूम कार्यक्षमता को लागू करने के, जो मैंने देखा है, उससे अलग एक नया वर्कअराउंड मिला है।

ज़ूम / ओरिएंटेशन समस्या के विभिन्न अन्य समाधानों पर एक उत्कृष्ट पृष्ठभूमि Sérgio Lopes द्वारा है: चित्र के लिए अभिविन्यास परिवर्तन पर प्रसिद्ध iOS ज़ूम बग पर एक फिक्स

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" id="viewport" content="user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
    <title>Robocat mobile Safari zoom fix</title>
    <style>
        body {
            padding: 0;
            margin: 0;
        }
        #container {
            -webkit-transform-origin: 0px 0px;
            -webkit-transform: scale3d(1,1,1);
            /* shrink-to-fit needed so can measure width of container http://stackoverflow.com/questions/450903/make-css-div-width-equal-to-contents */
            display: inline-block;
            *display: inline;
            *zoom: 1;
        }
        #zoomfix {
            opacity: 0;
            position: absolute;
            z-index: -1;
            top: 0;
            left: 0;
        }
    </style>
</head>

<body>
    <input id="zoomfix" disabled="1" tabIndex="-1">
    <div id="container">
        <style>
            table {
                counter-reset: row cell;
                background-image: url(http://upload.wikimedia.org/wikipedia/commons/3/38/JPEG_example_JPG_RIP_010.jpg);
            }
            tr {
                counter-increment: row;
            }
            td:before {
                counter-increment: cell;
                color: white;
                font-weight: bold;
                content: "row" counter(row) ".cell" counter(cell);
            }
        </style>
        <table cellspacing="10">
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
        </table>
    </div>

    <script>
    (function() {
        var viewportScale = 1;
        var container = document.getElementById('container');
        var scale, originX, originY, relativeOriginX, relativeOriginY, windowW, windowH, containerW, containerH, resizeTimer, activeElement;
        document.addEventListener('gesturestart', function(event) {
            scale = null;
            originX = event.pageX;
            originY = event.pageY;
            relativeOriginX = (originX - window.pageXOffset) / window.innerWidth;
            relativeOriginY = (originY - window.pageYOffset) / window.innerHeight;
            windowW = window.innerWidth;
            windowH = window.innerHeight;
            containerW = container.offsetWidth;
            containerH = container.offsetHeight;
        });
        document.addEventListener('gesturechange', function(event) {
            event.preventDefault();
            if (originX && originY && event.scale && event.pageX && event.pageY) {
                scale = event.scale;
                var newWindowW = windowW / scale;
                if (newWindowW > containerW) {
                    scale = windowW / containerW;
                }
                var newWindowH = windowH / scale;
                if (newWindowH > containerH) {
                    scale = windowH / containerH;
                }
                if (viewportScale * scale < 0.1) {
                    scale = 0.1/viewportScale;
                }
                if (viewportScale * scale > 10) {
                    scale = 10/viewportScale;
                }
                container.style.WebkitTransformOrigin = originX + 'px ' + originY + 'px';
                container.style.WebkitTransform = 'scale3d(' + scale + ',' + scale + ',1)';
            }
        });
        document.addEventListener('gestureend', function() {
            if (scale && (scale < 0.95 || scale > 1.05)) {
                viewportScale *= scale;
                scale = null;
                container.style.WebkitTransform = '';
                container.style.WebkitTransformOrigin = '';
                document.getElementById('viewport').setAttribute('content', 'user-scalable=no,initial-scale=' + viewportScale + ',minimum-scale=' + viewportScale + ',maximum-scale=' + viewportScale);
                document.body.style.WebkitTransform = 'scale3d(1,1,1)';
                // Without zoomfix focus, after changing orientation and zoom a few times, the iOS viewport scale functionality sometimes locks up (and completely stops working).
                // The reason I thought this hack would work is because showing the keyboard is the only way to affect the viewport sizing, which forces the viewport to resize (even though the keyboard doesn't actually get time to open!).
                // Also discovered another amazing side effect: if you have no meta viewport element, and focus()/blur() in gestureend, zoom is disabled!! Wow!
                var zoomfix = document.getElementById('zoomfix');
                zoomfix.disabled = false;
                zoomfix.focus();
                zoomfix.blur();
                setTimeout(function() {
                    zoomfix.disabled = true;
                    window.scrollTo(originX - relativeOriginX * window.innerWidth, originY - relativeOriginY * window.innerHeight);
                    // This forces a repaint. repaint *intermittently* fails to redraw correctly, and this fixes the problem.
                    document.body.style.WebkitTransform = '';
                }, 0);
            }
        });
    })();
    </script>
</body>
</html>

इसमें सुधार किया जा सकता था, लेकिन मेरी जरूरतों के लिए यह उन प्रमुख कमियों से बचता है जो मेरे द्वारा देखे गए अन्य सभी समाधानों के साथ होती हैं। अब तक मैंने केवल iOS4 के साथ iPad 2 पर मोबाइल सफारी का उपयोग करके इसका परीक्षण किया है।

फोकस () / धुंधला () ज़ूम कार्यक्षमता के सामयिक लॉकअप को रोकने के लिए एक समाधान है जो अभिविन्यास बदलने और कुछ समय ज़ूम करने के बाद हो सकता है।

Document.body.style सेट करना एक पूर्ण स्क्रीन रिप्रेसेंट को बाध्य करता है, जो एक सामयिक रुक-रुक कर आने वाली समस्याओं से बचा जाता है, जहां ज़ूम के बाद रिपेंट बुरी तरह से विफल हो जाता है।


0

एलिज़ाबेथ आप मेटाटैग में "आईडी" संपत्ति जोड़कर व्यूपोर्ट सामग्री को गतिशील रूप से बदल सकते हैं:

<meta name="viewport" id="view" content="user-scalable=yes, width=device-width minimum-scale=1, maximum-scale=1" />

तो आप बस जावास्क्रिप्ट द्वारा कॉल कर सकते हैं:

document.getElementById("view").setAttribute('content','user-scalable=yes, width=device-width, minimum-scale=1, maximum-scale=10');

@bridgestew अगर आप ज़ूम बदलना चाहते हैं या व्यूपोर्ट डिनमैटिक रूप से uiwebview में शामिल सबव्यू स्क्रॉलव्यू का उपयोग कर सकते हैं। मैंने अन्य थ्रेड पर एक नमूना स्निपेट जोड़ा: लिंक
एम पेन्ड्स

4
@ एलिसबेथ क्या यह आपके लिए काम करता है? यह मेरे लिए लैंडस्केप मोड में स्विच करते समय ज़ूम को रीसेट नहीं करता है।
उदाहरण के लिए मुझे

0

यहाँ यह करने का एक और तरीका है, जो अच्छी तरह से काम करता है।

  1. व्यूपोर्ट को स्केल = 1 तक सीमित करने के लिए मेटा टैग सेट करें, जो ज़ूम करने से रोकता है:

    <मेटा नाम = "व्यूपोर्ट" सामग्री = "चौड़ाई = डिवाइस-चौड़ाई, प्रारंभिक-स्केल = 1, न्यूनतम-स्केल = 1, अधिकतम-स्केल = 1">

  2. जावास्क्रिप्ट के साथ, ज़ूम करने की अनुमति देने के लिए मेटा टैग 1/2 सेकंड बाद में बदलें:

    setTimeout (फ़ंक्शन () {document.querySelector ("मेटा [नाम = viewport]")।

  3. फिर से जावास्क्रिप्ट के साथ, अभिविन्यास परिवर्तन पर, पृष्ठ को पुनः लोड करें:

    window.onorientationchange = function () {window.location.reload ();};

हर बार जब आप डिवाइस को पुनः प्राप्त करते हैं, तो पृष्ठ पुनः लोड होता है, शुरू में बिना ज़ूम के। लेकिन 1/2 सेकंड बाद, ज़ूम करने की क्षमता बहाल हो जाती है।


6
प्रश्न के 5 साल बाद जवाब दिया गया कि यह कुछ है .. दुर्भाग्य से यह नहीं है कि वेब 2015 में कैसे काम करता है। जब उपयोगकर्ता अपने डिवाइस को घुमाता है तो आप पृष्ठ को फिर से लोड नहीं करते हैं।
पियरे

0

बहुत आसानी से लागू किया गया फिक्स मिला। प्रपत्र को पूरा करने पर एक पाठ तत्व पर ध्यान केंद्रित करें, जिसका फ़ॉन्ट आकार 50px है। यदि पाठ तत्व छिपा हुआ है, तो यह काम नहीं करता है, लेकिन इस तत्व को छिपाना आसानी से तत्वों की रंग गुणों को निर्धारित करके किया जाता है, जिसमें कोई अस्पष्टता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.