কীভাবে কোনও ইউআইবিউবভিউয়ের সামগ্রীর আকার নির্ধারণ করবেন?


116

আমার কাছে UIWebViewআলাদা (একক পৃষ্ঠা) সামগ্রী রয়েছে। আমি CGSizeআমার পিতামাতার মতামতগুলি যথাযথ আকারে পরিবর্তন করতে সামগ্রীর সামগ্রীর সন্ধান করতে চাই। সুস্পষ্ট -sizeThatFits:দুর্ভাগ্যবশত শুধু WebView বর্তমান ফ্রেমের আকার ফেরৎ।


1
আমি নিশ্চিত নই, তবে সম্ভবত এই প্রশ্নের উত্তরগুলি সাহায্য করবে: stackoverflow.com/questions/745160/…
গ্রেগ

উত্তর:


250

দেখা গেল যে আমার ব্যবহার প্রথম অনুমানটি -sizeThatFits:সম্পূর্ণ ভুল ছিল না। এটি কাজ করছে বলে মনে হয় তবে কেবলমাত্র ওয়েব ভিউয়ের ফ্রেম প্রেরণের আগে একটি ন্যূনতম আকারে সেট করা থাকে -sizeThatFits:। এর পরে আমরা সঠিক আকারের দ্বারা ভুল ফ্রেমের আকার সংশোধন করতে পারি। এটি ভয়ানক শোনায় তবে এটি আসলে খুব খারাপ নয়। যেহেতু আমরা উভয় ফ্রেমের পরিবর্তন একে অপরের ঠিক পরে থাকি তাই দৃশ্যটি আপডেট হয় না এবং ঝাঁকুনি দেয় না।

অবশ্যই, সামগ্রীটি লোড না হওয়া পর্যন্ত আমাদের অপেক্ষা করতে হবে, তাই আমরা -webViewDidFinishLoad:প্রতিনিধি পদ্ধতিতে কোডটি রেখেছি।

OBJ-সি

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGRect frame = aWebView.frame;
    frame.size.height = 1;
    aWebView.frame = frame;
    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
    frame.size = fittingSize;
    aWebView.frame = frame;

    NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
}

সুইফট 4.x

func webViewDidFinishLoad(_ webView: UIWebView) {
    var frame = webView.frame
    frame.size.height = 1
    webView.frame = frame
    let fittingSize = webView.sizeThatFits(CGSize.init(width: 0, height: 0))
    frame.size = fittingSize
    webView.frame = frame
}

আমি জাভাস্ক্রিপ্ট ব্যবহার করে আরেকটি পদ্ধতির (ধন্যবাদ @ গ্রেগইনওয়াইগ) উল্লেখ করা উচিত । কোন সমাধানটি আরও ভাল সম্পাদন করে তা নিশ্চিত নয়।

দুটি হ্যাকি সমাধানের সাথে আমি এটি আরও ভাল পছন্দ করি।


আমি আপনার পদ্ধতির চেষ্টা করেছি। আমি যে সমস্যাটি অনুভব করেছি তা হ'ল কোনও স্ক্রোলিং নেই। কোনও পরামর্শ?
পরীক্ষা

1
আমি জানতে পেরেছি যে পরিবর্তিত ওয়েবভিউ উচ্চতার কারণে স্ক্রোলিংয়ের সাথে সমস্যা দেখা দেয়। আমাকে কি ইউআইভিউউজের আকার পরিবর্তন করতে হবে?
পরীক্ষা

আপনার সমস্যাটি কী তা নিশ্চিত নয়। আপনি কিছু কোড বা বিবরণ সহ একটি নতুন প্রশ্ন পোস্ট করতে পারেন?
অর্টউইন জেন্টজ

@ টেস্টিং, @ বোগাটায়ার: ঠিক আছে, UIWebViewআপনার পিতা-মাতার দেখার চেয়ে বেশি হলে আপনার এটিতে এম্বেড করা দরকার UIScrollView
অর্টউইন জেন্টজ

7
যদি আমি প্রদান করছি ওয়েবভিউ.স্কেলপেজটফিট = হ্যাঁ; তারপরে কেবল এই সমাধানটি কাজ করে .. সমাধানের জন্য ধন্যবাদ ..
এসপি

92

আমার আরও একটি সমাধান রয়েছে যা দুর্দান্ত কাজ করে।

একদিকে অর্টউইনের পদ্ধতি ও সমাধান কেবল আইওএস 6.0 এবং তারপরেই কাজ করে তবে আইওএস 5.0, 5.1 এবং 5.1.1 এ সঠিকভাবে কাজ করতে ব্যর্থ হয়েছে এবং অন্যদিকে এমন কিছু আছে যা আমি পছন্দ করি না এবং বুঝতে পারি না অর্টউইনের পদ্ধতির সাথে, এটি [webView sizeThatFits:CGSizeZero]প্যারামিটারের সাথে পদ্ধতিটির ব্যবহার CGSizeZero: আপনি যদি এই পদ্ধতিগুলি এবং এর পরামিতি সম্পর্কে অ্যাপল অফিসিয়াল ডকুমেন্টেশন পড়েন তবে এটি স্পষ্টভাবে বলে:

এই পদ্ধতির ডিফল্ট বাস্তবায়ন দর্শনের সীমানা আয়তক্ষেত্রের আকারের অংশটি প্রদান করে। যে কোনও সাবভিউয়ের পছন্দসই বিন্যাসের উপর ভিত্তি করে একটি কাস্টম মান ফেরতের জন্য সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করতে পারে। উদাহরণস্বরূপ, একটি ইউআইএসভিচ অবজেক্ট একটি স্থির আকারের মান প্রদান করে যা একটি স্যুইচ ভিউর মানক আকারের প্রতিনিধিত্ব করে এবং একটি ইউআইআইমেজভিউ অবজেক্টটি বর্তমানে প্রদর্শিত চিত্রটির আকার প্রদান করে।

আমার অর্থ হ'ল এটি এমন যে তিনি কোনও যুক্তি ছাড়াই তার সমাধানটি পেরিয়ে এসেছিলেন কারণ ডকুমেন্টেশন পড়ার সাথে সাথে প্যারামিটারটি [webView sizeThatFits: ...]কমপক্ষে পছন্দসই হওয়া উচিত width। তার সমাধান সহ, প্যারামিটারের সাথে webViewকল sizeThatFitsকরার আগে কাঙ্ক্ষিত প্রস্থটি এর ফ্রেমে সেট করা আছে CGSizeZero। সুতরাং আমি বজায় রাখছি এই সমাধানটি "সুযোগ" দ্বারা আইওএস 6 এ কাজ করছে।

আমি আরও যুক্তিযুক্ত পদ্ধতির কল্পনা করেছি, যার আইওএস 5.0 এবং তার পরে কাজ করার সুবিধা রয়েছে ... এবং এমন জটিল পরিস্থিতিতেও যেখানে একাধিক ওয়েব ভিউ (এর সম্পত্তিটি webView.scrollView.scrollEnabled = NOএম্বেড থাকে) scrollView

এখানে বহির্বিন্যাস বলপূর্বক আমার কোড webViewআকাঙ্ক্ষিত করতে widthএবং সংশ্লিষ্ট পেতে heightসেট ফিরে webViewনিজেই:

OBJ-সি

- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{   
    aWebView.scrollView.scrollEnabled = NO;    // Property available in iOS 5.0 and later 
    CGRect frame = aWebView.frame;

    frame.size.width = 200;       // Your desired width here.
    frame.size.height = 1;        // Set the height to a small one.

    aWebView.frame = frame;       // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).

    frame.size.height = aWebView.scrollView.contentSize.height;  // Get the corresponding height from the webView's embedded scrollView.

    aWebView.frame = frame;       // Set the scrollView contentHeight back to the frame itself.
}

সুইফট 4.x

func webViewDidFinishLoad(_ aWebView: UIWebView) {

    aWebView.scrollView.isScrollEnabled = false
    var frame = aWebView.frame

    frame.size.width = 200
    frame.size.height = 1

    aWebView.frame = frame
    frame.size.height = aWebView.scrollView.contentSize.height

    aWebView.frame = frame;
}

নোট যে আমার উদাহরণে, webViewএকটি কাস্টম এমবেড করা হয় scrollViewঅন্যান্য থাকার webViews... এই সব webViewsতাদের ছিল webView.scrollView.scrollEnabled = NO, এবং আমি যোগ করার জন্য ছিল কোডের শেষ টুকরা হিসাব ছিল heightএর contentSizeআমার কাস্টম এর scrollViewএই এম্বেডিং webViews, কিন্তু এটা সহজ ছিল summing হিসাবে আমার webView's frame.size.heightকৌতুক সঙ্গে নির্ণিত উপরে বর্ণিত ...


3
এটি গৃহীত সমাধানের চেয়ে অনেক বেশি মার্জিত এবং এটি অনিবন্ধিত এবং অপরিজ্ঞাত আচরণের উপর নির্ভর করে না। এটি জাভাস্ক্রিপ্ট সন্নিবেশ করানোর চেয়ে অনেক কম হ্যাকিশ। আমি আশা করি আমি এই 64 বার upvote করতে পারে।
বাগগাফ

ঠিক এটাই আমি ব্যাখ্যা করার চেষ্টা করেছি। ধন্যবাদ. এবং এটির দুর্দান্ত সুবিধাটি হ'ল এটি সমস্ত আইওএস সংস্করণে কাজ করছে বলে মনে হচ্ছে।
ফেনোমেনা

সমাধানটি দেখতে দুর্দান্ত দেখাচ্ছে, তবে আপনি যদি এখনও আইওএস ৪.x লক্ষ্য করে থাকেন তবে সাবধান হন be -[UIWebView scrollView]আইওএস 5.0 বা তার পরে কেবল উপলব্ধ।
অর্টউইন জেন্টজ

2
আমি এটির অনুরূপ সমাধানটি চেষ্টা করেছি এবং প্রমাণিত হয়েছে যে ওয়েবভিউ বা এটি এমবেড করা ভিউ যদি ইতিমধ্যে পর্দায় থাকে তবে এটি কেবল কাজ করে। আপনি যদি ভিউ হায়ারার্কিতে ওয়েবভিউ যুক্ত করার আগে এটি চেষ্টা করেন, ফলাফলটি ম্যানুয়াল আকারের উচ্চতা হবে।

1
অন্য সমাধান প্রতিবার কাজ করে না, কেন জানি না, তবে এই কৌশলটি কার্যকর করে !!! এটি একটি সঠিক উত্তর ট্যাগ করা উচিত।
ভ্যাসিলি

37

এই প্রশ্নটি পুনরুত্থিত করা কারণ আমি কেবল বেশিরভাগ সময় কাজ করার জন্য অর্টউইনের উত্তর পেয়েছি ...

webViewDidFinishLoadপদ্ধতি একাধিকবার বলা যেতে পারে, এবং যে প্রথম মান দ্বারা ফিরে sizeThatFitsকেবল চূড়ান্ত আকার হওয়া উচিত কিছু অংশ। তারপরে যে কোনও কারণে পরের কলটি আবারও sizeThatFitsযখন webViewDidFinishLoadঅগ্নিকাণ্ডে আসে তখন ভুল করে আগের মতো একই মানটি ফিরিয়ে দেয়! এটি একই বিষয়বস্তুর জন্য এলোমেলোভাবে ঘটবে যেন এটি একরকম সম্মতিযুক্ত সমস্যা। সময়ের সাথে সাথে এই আচরণটি পরিবর্তিত হয়েছে, কারণ আমি আইওএস 5 তৈরি করছি এবং এটিও sizeToFitএকইরকমভাবে কাজ করে দেখতে পেয়েছি (যদিও আগে এটি হয়নি?)

আমি এই সহজ সমাধানে স্থির করেছি:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{        
    CGFloat height = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
    CGFloat width = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue];
    CGRect frame = aWebView.frame;
    frame.size.height = height;
    frame.size.width = width;
    aWebView.frame = frame;
}

সুইফ্ট (২.২):

func webViewDidFinishLoad(webView: UIWebView) {

    if let heightString = webView.stringByEvaluatingJavaScriptFromString("document.height"),
        widthString = webView.stringByEvaluatingJavaScriptFromString("document.width"),
        height = Float(heightString),
        width = Float(widthString) {

        var rect = webView.frame
        rect.size.height = CGFloat(height)
        rect.size.width = CGFloat(width)
        webView.frame = rect
    }
}

আপডেট: আমি মন্তব্যে উল্লিখিত হিসাবে পেয়েছি যে বিষয়বস্তু সঙ্কুচিত হয়েছে এমন ঘটনাটি মনে হয় না। এটি সমস্ত সামগ্রী এবং ওএস সংস্করণের জন্য সত্য কিনা তা নিশ্চিত নন, এটি চেষ্টা করে দেখুন।


আপনি কি আপনার ওয়েব পৃষ্ঠায় চিত্র বা অন্যান্য সম্পদ অন্তর্ভুক্ত করেছেন? এটি ডেলিগেটের অতিরিক্ত গুলি ছোঁড়ার কারণ হতে পারে। এ ছাড়া আপনার সমাধানটি কেবল তখন কাজ করে যখন আপনি webView.scalesPageToFit = YESউপরের মন্তব্যে @ সিজো হিসাবে উল্লেখ করবেন না ।
অর্টউইন জেন্টজ

হ্যাঁ সম্ভবত এটিই - আপনার সমাধানটি কেবল আমার পাঠ্য ক্ষেত্রেই ঠিক কাজ করে। চূড়ান্ত প্রতিনিধি কল চলাকালীন সাইজটিফিটগুলি সঠিক মান না দেওয়া সমস্যা ... খুব আশ্চর্যজনক। আমরা কীভাবে জানতে পারি যে কোন কলটি শেষ হতে চলেছে তাই আমরা তখন পর্যন্ত সাইজটি্যাটফিট ব্যবহার করার চেষ্টা করব না?
কাইরান হার্পার

যদি প্রথম প্রতিনিধি কলটিতে আপনি আকারটিটফিটস থেকে সঠিক ফলাফল পান, আপনি কি নিম্নলিখিত কোনও কলকে উপেক্ষা করতে পারবেন না?
অর্টউইন জেন্টজ

হ্যাঁ তবে এটি অন্য উপায়েই আছে :) প্রথম প্রতিনিধি কলের ফলে ভুল আকারের ফলস্বরূপ ফলস্বরূপ ফলাফল আসতে পারে, তারপরে সেই মানটি আটকে যায়। এটি আকারের মতোই যেটি আকারত্যাগটি হ'ল একরকম ওয়েব ভিউ সংশোধন করছে যাতে আরও যে কোনও আকারThatFits কলগুলি একই ফল দেয়, বা এটি ফ্রেমের সেটিংস সেটিই করছে যখন এটি করা হচ্ছে।
কাইরান হার্পার

1
এই সমাধানটি ঠিক মতো কাজ করে না। আপনি একবার বৃহত্তর পৃষ্ঠাটি সেট করে, এবং তারপরে আরও ছোট সেট করলে আপনি সর্বদা বৃহত্তর মানটি ফিরে পাবেন। দেখে মনে হচ্ছে এটি "অলস" অভ্যন্তরীণ দৃষ্টিভঙ্গি প্রসারিত করে। এই জন্য কোন workaround?
লেগোলেস

23

এক্সকোড 8 এবং আইওএস 10 এ কোনও ওয়েব ভিউয়ের উচ্চতা নির্ধারণ করতে। আপনি উচ্চতা ব্যবহার করে পেতে পারেন

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
    NSLog(@"Webview height is:: %f", height);
}

বা সুইফ্টের জন্য

 func webViewDidFinishLoad(aWebView:UIWebView){
        let height: Float = (aWebView.stringByEvaluatingJavaScriptFromString("document.body.scrollHeight")?.toFloat())!
        print("Webview height is::\(height)")
    }

1
ওয়েবভিউ সামগ্রীর আকার ব্যবহার করে খোঁজ করার চেষ্টা করুন .. myWebView.scrollView.contentSize.height
হার্ডিক

8

একটি সহজ সমাধান কেবল ব্যবহার করা হবে webView.scrollView.contentSizeতবে আমি জানি না এটি জাভাস্ক্রিপ্টের সাথে কাজ করে কিনা। যদি কোনও জাভাস্ক্রিপ্ট ব্যবহার না করা থাকে তবে এটি নিশ্চিতভাবে কাজ করে:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGSize contentSize = aWebView.scrollView.contentSize;
    NSLog(@"webView contentSize: %@", NSStringFromCGSize(contentSize));
}

3

এএএআইএইকে আপনি [webView sizeThatFits:CGSizeZero]এটির সামগ্রী আকার নির্ধারণ করতে ব্যবহার করতে পারেন ।


3

এই অদ্ভুত!

আমি সমাধান পরীক্ষিত উভয় sizeThatFits:এবং [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]করছে না আমার জন্য কাজ।

তবে আমি ওয়েবপৃষ্ঠা সামগ্রীর সঠিক উচ্চতা পেতে একটি আকর্ষণীয় সহজ উপায় খুঁজে পেয়েছি। বর্তমানে, আমি এটি আমার প্রতিনিধি পদ্ধতিতে ব্যবহার করেছি scrollViewDidScroll:

CGFloat contentHeight = scrollView.contentSize.height - CGRectGetHeight(scrollView.frame);

আইওএস 9.3 সিমুলেটার / ডিভাইসে যাচাই করা হয়েছে, শুভকামনা!

সম্পাদনা করুন:

পটভূমি: এইচটিএমএল সামগ্রীটি আমার স্ট্রিং ভেরিয়েবল এবং এইচটিটিপি কনটেন্ট টেম্পলেট দ্বারা গণনা করা হয়, পদ্ধতি দ্বারা লোড করা হয় loadHTMLString:baseURL:, সেখানে কোনও নিবন্ধভুক্ত জেএস স্ক্রিপ্ট নেই।


3

IOS10 জন্য, আমি পেয়ে ছিল 0 (শূন্য) মান document.heightতাই document.body.scrollHeightসমাধান নথির উচ্চতা পেতে Webview হল রয়েছে। সমস্যাটির জন্যও সমাধান করা যেতে পারে width


2

আমি UIWebViewএমন একটি ব্যবহার করছি যা এর জন্য এইচটিএমএল সামগ্রীর আকার নির্ধারণ করতে একটি সংক্ষিপ্তসার নয় (এবং এটি উইন্ডো শ্রেণিবিন্যাসের অংশ নয়) UITableViewCells। আমি দেখতে পেয়েছি যে সংযোগ বিচ্ছিন্নভাবে UIWebViewএর আকারটি সঠিকভাবে প্রতিবেদন করে না -[UIWebView sizeThatFits:]। অতিরিক্ত হিসাবে, https://stackoverflow.com/a/3937599/9636 এ উল্লিখিত হিসাবে, যথাযথ উচ্চতা পেতে আপনাকে অবশ্যই 1 UIWebViewএর frame height1 সেট করতে হবে।

যদি UIWebViewএর উচ্চতা খুব বেশি হয় (যেমন আপনি এটি 1000 এ সেট করেছেন তবে HTML সামগ্রীর আকারটি কেবল 500):

UIWebView.scrollView.contentSize.height
-[UIWebView stringByEvaluatingJavaScriptFromString:@"document.height"]
-[UIWebView sizeThatFits:]

সমস্ত height1000 এর প্রত্যাবর্তন করে ।

এই ক্ষেত্রে আমার সমস্যা সমাধানের জন্য, আমি https://stackoverflow.com/a/11770883/9636 ব্যবহার করেছি , যা আমি যথাযথভাবে ভোট দিয়েছি। তবে আমি কেবল তখনই এই সমাধানটি ব্যবহার করি যখন আমার UIWebView.frame.widthমতো হয় -[UIWebView sizeThatFits:] width


1
আমি এই থ্রেডের সমস্ত উদাহরণ চেষ্টা করেছি এবং নথির উচ্চতা পুনরুদ্ধার করতে "ডকুমেন্ট.হাইট" ব্যবহার করা সবচেয়ে নির্ভরযোগ্য। অতিরিক্ত এইচটিএমএল একটি ধারক (যেমন ডিআইভি) এর বাইরে যুক্ত করা যেতে পারে যা আমার সম্পাদিত সমস্ত পরীক্ষায় getElementById (...) অবিশ্বস্ত করে তোলে। ডকুমেন্ট.হাইট একটি ট্রিট কাজ করে।
জন রজারস

2

এখানকার পরামর্শগুলির মধ্যে কোনওটিই আমার পরিস্থিতি সম্পর্কে আমাকে সহায়তা করেনি, তবে আমি এমন কিছু পড়েছি যা আমাকে উত্তর দিয়েছে। আমার কাছে একটি ইউআইউইউবভিউয়ের পরে ইউআই নিয়ন্ত্রণের একটি নির্দিষ্ট সেট সহ একটি ভিউকন্ট্রোলার রয়েছে। আমি পুরো পৃষ্ঠাটি এমনভাবে স্ক্রোল করতে চেয়েছিলাম যেন ইউআই নিয়ন্ত্রণগুলি HTML সামগ্রীর সাথে সংযুক্ত ছিল, তাই আমি ইউআইউইউবভিউতে স্ক্রোলিং অক্ষম করি এবং তারপরে অবশ্যই প্যারেন্ট স্ক্রোল দর্শনের সামগ্রীর আকারটি সঠিকভাবে সেট করতে হবে।

গুরুত্বপূর্ণ টিপটি পরিণত হয়েছিল যে স্ক্রিনে রেকর্ড হওয়া পর্যন্ত UIWebView তার আকারটিকে সঠিকভাবে রিপোর্ট করে না। সুতরাং আমি যখন সামগ্রীটি লোড করি তখন আমি উপলব্ধ স্ক্রিনের উচ্চতায় সামগ্রীর আকার সেট করি। তারপরে, ভিডিড অ্যাপে আমি স্ক্রোলভিউয়ের সামগ্রীর আকারকে সঠিক মানটিতে আপডেট করি। এটি আমার পক্ষে কাজ করেছে কারণ আমি স্থানীয় সামগ্রীতে লোডএইচটিএমএল স্ট্রিং করছি। আপনি যদি লোডরিকোয়েস্ট ব্যবহার করছেন তবে এইচটিএমএল কত তাড়াতাড়ি পুনরুদ্ধার করা হয়েছে তার উপর নির্ভর করে আপনাকে ওয়েবভিউডইডফিনিশলুডেও কনটেন্ট সাইজ আপডেট করতে হবে।

কোনও ঝাঁকুনি নেই, কারণ কেবল স্ক্রোল ভিউয়ের অদৃশ্য অংশটি পরিবর্তন করা হয়েছে।


আমি আশঙ্কা করি এটি নিখুঁত ভাগ্য যে ওয়েব ভিউটি এত তাড়াতাড়ি লোড হয়ে যায় যা ভিউডিড অ্যাপে শেষ হয়। সম্ভবত এটি কেবলমাত্র তখনই কার্যকর হয় যদি ভিউটি অ্যানিমেটেড প্রদর্শিত হয় তাই অ্যানিমেশনটি সামগ্রী লোড করার জন্য যথেষ্ট দীর্ঘ। আমি বরং webViewDidFinishLoadনিরাপদ পদ্ধতির উপর নির্ভর করব ।
অর্টউইন জেন্টজ

2

যদি আপনার এইচটিএমএল ভারী থাকে এইচটিএমএল-বিষয়বস্তু রয়েছে যেমন ইফ্রেমের (যেমন ফেসবুক-, টুইটার, ইনস্টাগ্রাম-এম্বেড) থাকে তবে আসল সমাধানটি আরও বেশি কঠিন, প্রথমে আপনার এইচটিএমএলটি মোড়ুন:

[htmlContent appendFormat:@"<html>", [[LocalizationStore instance] currentTextDir], [[LocalizationStore instance] currentLang]];
[htmlContent appendFormat:@"<head>"];
[htmlContent appendString:@"<script type=\"text/javascript\">"];
[htmlContent appendFormat:@"    var lastHeight = 0;"];
[htmlContent appendFormat:@"    function updateHeight() { var h = document.getElementById('content').offsetHeight; if (lastHeight != h) { lastHeight = h; window.location.href = \"x-update-webview-height://\" + h } }"];
[htmlContent appendFormat:@"    window.onload = function() {"];
[htmlContent appendFormat:@"        setTimeout(updateHeight, 1000);"];
[htmlContent appendFormat:@"        setTimeout(updateHeight, 3000);"];
[htmlContent appendFormat:@"        if (window.intervalId) { clearInterval(window.intervalId); }"];
[htmlContent appendFormat:@"        window.intervalId = setInterval(updateHeight, 5000);"];
[htmlContent appendFormat:@"        setTimeout(function(){ clearInterval(window.intervalId); window.intervalId = null; }, 30000);"];
[htmlContent appendFormat:@"    };"];
[htmlContent appendFormat:@"</script>"];
[htmlContent appendFormat:@"..."]; // Rest of your HTML <head>-section
[htmlContent appendFormat:@"</head>"];
[htmlContent appendFormat:@"<body>"];
[htmlContent appendFormat:@"<div id=\"content\">"]; // !important https://stackoverflow.com/a/8031442/1046909
[htmlContent appendFormat:@"..."]; // Your HTML-content
[htmlContent appendFormat:@"</div>"]; // </div id="content">
[htmlContent appendFormat:@"</body>"];
[htmlContent appendFormat:@"</html>"];

তারপরে আপনার কাঁধে স্টার্টলডড উইথআরউয়েস্টে এক্স-আপডেট- ওয়েবভিউ -উচ্চতা- স্কিম পরিচালনা করা যুক্ত করুন :

    if (navigationType == UIWebViewNavigationTypeLinkClicked || navigationType == UIWebViewNavigationTypeOther) {
    // Handling Custom URL Scheme
    if([[[request URL] scheme] isEqualToString:@"x-update-webview-height"]) {
        NSInteger currentWebViewHeight = [[[request URL] host] intValue];
        if (_lastWebViewHeight != currentWebViewHeight) {
            _lastWebViewHeight = currentWebViewHeight; // class property
            _realWebViewHeight = currentWebViewHeight; // class property
            [self layoutSubviews];
        }
        return NO;
    }
    ...

এবং অবশেষে আপনার লেআউটসুভিউগুলিতে নিম্নলিখিত কোডটি যুক্ত করুন :

    ...
    NSInteger webViewHeight = 0;

    if (_realWebViewHeight > 0) {
        webViewHeight = _realWebViewHeight;
        _realWebViewHeight = 0;
    } else {
        webViewHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"content\").offsetHeight;"] integerValue];
    }

    upateWebViewHeightTheWayYorLike(webViewHeight);// Now your have real WebViewHeight so you can update your webview height you like.
    ...

পিএস আপনি আপনার অবজেক্টিভি / সুইফট-কোডের মধ্যে সময় দেরি (সেটটাইমআউট এবং সেটইন্টারভাল) বাস্তবায়ন করতে পারেন - এটি আপনার উপর নির্ভর করে।

পিএসএস ইউআইউইউবভিউ এবং ফেসবুক এম্বেড সম্পর্কে গুরুত্বপূর্ণ তথ্য: এম্বেড করা ফেসবুক পোস্টটি ইউআইওউবভিউতে সঠিকভাবে প্রদর্শিত হয় না


এটা মজার! আপনি কী বর্ণনা করতে পারবেন যে স্ক্রিপ্ট অংশটি কী করে এবং প্রয়োজনে কীভাবে এটি টুইট করা যায়? দেখে মনে হচ্ছে এটি পর্যায়ক্রমে উচ্চতাটি পরীক্ষা করবে, তবে একাধিক সময়ের বিরতি জড়িত রয়েছে?
কাইরান হার্পার

@ কিয়েরান হার্পার, আপনার ঠিক কী বর্ণনা করা দরকার?
মিংগালেভএমই

2

স্ক্রোলভিউতে কোথাও ওয়েবভিউটিকে সাবউভিউ হিসাবে ব্যবহার করার সময়, আপনি কিছু ধ্রুবক মানের জন্য উচ্চতার সীমাবদ্ধতা সেট করতে পারেন এবং পরে এটি থেকে আউটলেট তৈরি করতে পারেন এবং এটির মতো ব্যবহার করতে পারেন:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    webView.scrollView.scrollEnabled = NO;
    _webViewHeight.constant = webView.scrollView.contentSize.height;
}

1

আমিও এই সমস্যায় আটকে আছি, তারপরে আমি বুঝতে পেরেছিলাম যে আমি যদি ওয়েবভিউর গতিশীল উচ্চতা গণনা করতে চাই তবে আমাকে প্রথমে ওয়েবভিউয়ের প্রস্থ বলতে হবে, তাই জেএসের আগে আমি একটি লাইন যুক্ত করেছিলাম এবং দেখা যাচ্ছে যে আমি পেতে পারি খুব সঠিক প্রকৃত উচ্চতা।

কোডটি এর মতো সহজ:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{

    //tell the width first
    webView.width = [UIScreen mainScreen].bounds.size.width;

    //use js to get height dynamically
    CGFloat scrollSizeHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
    webView.height = scrollSizeHeight;

    webView.x = 0;
    webView.y = 0;

    //......
}

1

এক্সকোড 8 সুইফট 3.1:

  1. ওয়েবভিউয়ের উচ্চতাটি প্রথমে 0 এ সেট করুন ।
  2. ইন webViewDidFinishLoadপ্রতিনিধি:

let height = webView.scrollView.contentSize.height

স্টেপ 1 ব্যতীত, যদি ওয়েবভিউ.হাইট> প্রকৃত সামগ্রী হাইট হয়, দ্বিতীয় ধাপটি ওয়েবভিউ.হাইটটি ফিরিয়ে দেবে তবে বিষয়বস্তু.হাইট নয়।


এই কারণেই আমি আমার ক্ষেত্রে প্রয়োজনীয় ফ্রেম পেতে পারি নি ..
upvated

0

এছাড়াও আইওএস in-তে উল্লিখিত সমস্ত পদ্ধতির যথাযথ কাজ করার জন্য এটি আপনার ভিউ নিয়ন্ত্রক viewDidLoadপদ্ধতিতে যুক্ত করুন:

if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

অন্যথায় কোনও পদ্ধতিই এটির মতো কাজ করবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.