আমার কাছে UIWebViewআলাদা (একক পৃষ্ঠা) সামগ্রী রয়েছে। আমি CGSizeআমার পিতামাতার মতামতগুলি যথাযথ আকারে পরিবর্তন করতে সামগ্রীর সামগ্রীর সন্ধান করতে চাই। সুস্পষ্ট -sizeThatFits:দুর্ভাগ্যবশত শুধু WebView বর্তমান ফ্রেমের আকার ফেরৎ।
আমার কাছে UIWebViewআলাদা (একক পৃষ্ঠা) সামগ্রী রয়েছে। আমি CGSizeআমার পিতামাতার মতামতগুলি যথাযথ আকারে পরিবর্তন করতে সামগ্রীর সামগ্রীর সন্ধান করতে চাই। সুস্পষ্ট -sizeThatFits:দুর্ভাগ্যবশত শুধু WebView বর্তমান ফ্রেমের আকার ফেরৎ।
উত্তর:
দেখা গেল যে আমার ব্যবহার প্রথম অনুমানটি -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
}
আমি জাভাস্ক্রিপ্ট ব্যবহার করে আরেকটি পদ্ধতির (ধন্যবাদ @ গ্রেগইনওয়াইগ) উল্লেখ করা উচিত । কোন সমাধানটি আরও ভাল সম্পাদন করে তা নিশ্চিত নয়।
দুটি হ্যাকি সমাধানের সাথে আমি এটি আরও ভাল পছন্দ করি।
UIWebViewআপনার পিতা-মাতার দেখার চেয়ে বেশি হলে আপনার এটিতে এম্বেড করা দরকার UIScrollView।
আমার আরও একটি সমাধান রয়েছে যা দুর্দান্ত কাজ করে।
একদিকে অর্টউইনের পদ্ধতি ও সমাধান কেবল আইওএস 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কৌতুক সঙ্গে নির্ণিত উপরে বর্ণিত ...
-[UIWebView scrollView]আইওএস 5.0 বা তার পরে কেবল উপলব্ধ।
এই প্রশ্নটি পুনরুত্থিত করা কারণ আমি কেবল বেশিরভাগ সময় কাজ করার জন্য অর্টউইনের উত্তর পেয়েছি ...
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উপরের মন্তব্যে @ সিজো হিসাবে উল্লেখ করবেন না ।
এক্সকোড 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)")
}
একটি সহজ সমাধান কেবল ব্যবহার করা হবে webView.scrollView.contentSizeতবে আমি জানি না এটি জাভাস্ক্রিপ্টের সাথে কাজ করে কিনা। যদি কোনও জাভাস্ক্রিপ্ট ব্যবহার না করা থাকে তবে এটি নিশ্চিতভাবে কাজ করে:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
CGSize contentSize = aWebView.scrollView.contentSize;
NSLog(@"webView contentSize: %@", NSStringFromCGSize(contentSize));
}
এই অদ্ভুত!
আমি সমাধান পরীক্ষিত উভয় sizeThatFits:এবং [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]করছে না আমার জন্য কাজ।
তবে আমি ওয়েবপৃষ্ঠা সামগ্রীর সঠিক উচ্চতা পেতে একটি আকর্ষণীয় সহজ উপায় খুঁজে পেয়েছি। বর্তমানে, আমি এটি আমার প্রতিনিধি পদ্ধতিতে ব্যবহার করেছি scrollViewDidScroll:।
CGFloat contentHeight = scrollView.contentSize.height - CGRectGetHeight(scrollView.frame);
আইওএস 9.3 সিমুলেটার / ডিভাইসে যাচাই করা হয়েছে, শুভকামনা!
সম্পাদনা করুন:
পটভূমি: এইচটিএমএল সামগ্রীটি আমার স্ট্রিং ভেরিয়েবল এবং এইচটিটিপি কনটেন্ট টেম্পলেট দ্বারা গণনা করা হয়, পদ্ধতি দ্বারা লোড করা হয় loadHTMLString:baseURL:, সেখানে কোনও নিবন্ধভুক্ত জেএস স্ক্রিপ্ট নেই।
আমি 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।
এখানকার পরামর্শগুলির মধ্যে কোনওটিই আমার পরিস্থিতি সম্পর্কে আমাকে সহায়তা করেনি, তবে আমি এমন কিছু পড়েছি যা আমাকে উত্তর দিয়েছে। আমার কাছে একটি ইউআইউইউবভিউয়ের পরে ইউআই নিয়ন্ত্রণের একটি নির্দিষ্ট সেট সহ একটি ভিউকন্ট্রোলার রয়েছে। আমি পুরো পৃষ্ঠাটি এমনভাবে স্ক্রোল করতে চেয়েছিলাম যেন ইউআই নিয়ন্ত্রণগুলি HTML সামগ্রীর সাথে সংযুক্ত ছিল, তাই আমি ইউআইউইউবভিউতে স্ক্রোলিং অক্ষম করি এবং তারপরে অবশ্যই প্যারেন্ট স্ক্রোল দর্শনের সামগ্রীর আকারটি সঠিকভাবে সেট করতে হবে।
গুরুত্বপূর্ণ টিপটি পরিণত হয়েছিল যে স্ক্রিনে রেকর্ড হওয়া পর্যন্ত UIWebView তার আকারটিকে সঠিকভাবে রিপোর্ট করে না। সুতরাং আমি যখন সামগ্রীটি লোড করি তখন আমি উপলব্ধ স্ক্রিনের উচ্চতায় সামগ্রীর আকার সেট করি। তারপরে, ভিডিড অ্যাপে আমি স্ক্রোলভিউয়ের সামগ্রীর আকারকে সঠিক মানটিতে আপডেট করি। এটি আমার পক্ষে কাজ করেছে কারণ আমি স্থানীয় সামগ্রীতে লোডএইচটিএমএল স্ট্রিং করছি। আপনি যদি লোডরিকোয়েস্ট ব্যবহার করছেন তবে এইচটিএমএল কত তাড়াতাড়ি পুনরুদ্ধার করা হয়েছে তার উপর নির্ভর করে আপনাকে ওয়েবভিউডইডফিনিশলুডেও কনটেন্ট সাইজ আপডেট করতে হবে।
কোনও ঝাঁকুনি নেই, কারণ কেবল স্ক্রোল ভিউয়ের অদৃশ্য অংশটি পরিবর্তন করা হয়েছে।
webViewDidFinishLoadনিরাপদ পদ্ধতির উপর নির্ভর করব ।
যদি আপনার এইচটিএমএল ভারী থাকে এইচটিএমএল-বিষয়বস্তু রয়েছে যেমন ইফ্রেমের (যেমন ফেসবুক-, টুইটার, ইনস্টাগ্রাম-এম্বেড) থাকে তবে আসল সমাধানটি আরও বেশি কঠিন, প্রথমে আপনার এইচটিএমএলটি মোড়ুন:
[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.
...
পিএস আপনি আপনার অবজেক্টিভি / সুইফট-কোডের মধ্যে সময় দেরি (সেটটাইমআউট এবং সেটইন্টারভাল) বাস্তবায়ন করতে পারেন - এটি আপনার উপর নির্ভর করে।
পিএসএস ইউআইউইউবভিউ এবং ফেসবুক এম্বেড সম্পর্কে গুরুত্বপূর্ণ তথ্য: এম্বেড করা ফেসবুক পোস্টটি ইউআইওউবভিউতে সঠিকভাবে প্রদর্শিত হয় না
স্ক্রোলভিউতে কোথাও ওয়েবভিউটিকে সাবউভিউ হিসাবে ব্যবহার করার সময়, আপনি কিছু ধ্রুবক মানের জন্য উচ্চতার সীমাবদ্ধতা সেট করতে পারেন এবং পরে এটি থেকে আউটলেট তৈরি করতে পারেন এবং এটির মতো ব্যবহার করতে পারেন:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
webView.scrollView.scrollEnabled = NO;
_webViewHeight.constant = webView.scrollView.contentSize.height;
}
আমিও এই সমস্যায় আটকে আছি, তারপরে আমি বুঝতে পেরেছিলাম যে আমি যদি ওয়েবভিউর গতিশীল উচ্চতা গণনা করতে চাই তবে আমাকে প্রথমে ওয়েবভিউয়ের প্রস্থ বলতে হবে, তাই জেএসের আগে আমি একটি লাইন যুক্ত করেছিলাম এবং দেখা যাচ্ছে যে আমি পেতে পারি খুব সঠিক প্রকৃত উচ্চতা।
কোডটি এর মতো সহজ:
-(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;
//......
}
এক্সকোড 8 সুইফট 3.1:
webViewDidFinishLoadপ্রতিনিধি:let height = webView.scrollView.contentSize.height
স্টেপ 1 ব্যতীত, যদি ওয়েবভিউ.হাইট> প্রকৃত সামগ্রী হাইট হয়, দ্বিতীয় ধাপটি ওয়েবভিউ.হাইটটি ফিরিয়ে দেবে তবে বিষয়বস্তু.হাইট নয়।
এছাড়াও আইওএস in-তে উল্লিখিত সমস্ত পদ্ধতির যথাযথ কাজ করার জন্য এটি আপনার ভিউ নিয়ন্ত্রক viewDidLoadপদ্ধতিতে যুক্ত করুন:
if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
অন্যথায় কোনও পদ্ধতিই এটির মতো কাজ করবে না।