ইউআইউইউভিউ ভিউতে ব্যবহারকারী নির্বাচনকে অক্ষম করা হচ্ছে


121

আমার কাছে এমন একটি অ্যাপ রয়েছে যেখানে আমি কন্টেন্ট লোড করে এটি UIWebViewউপস্থাপন করি। আমি ব্যবহারকারীর মিথস্ক্রিয়াটিকে সম্পূর্ণ অক্ষম করতে পারি না কারণ আমি চাই যে ব্যবহারকারী লিঙ্কগুলি ক্লিক করতে সক্ষম হন। আমার কেবল ব্যবহারকারী নির্বাচনটি অক্ষম করা দরকার। আপনি ইন্টারনেটসের কোথাও পেয়েছি যা আপনি ব্যবহার করতে পারেন:

document.body.style.webkitUserSelect='none';

আমি এটি inোকানোর চেষ্টা করেছি

[self.contentView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"]; 

ভিতরে webViewDidFinishLoad:

যাইহোক, এটা কাজ করে না। আমি এখনও ওয়েবভিউয়ের ভিতরে পাঠ্য নির্বাচন এবং অনুলিপি করতে সক্ষম।

কোন ধারণা কি ভুল হতে পারে?

আপডেট: এটি কেবল আইওএস ৪.৩ দিয়ে শুরু হবে বলে মনে হচ্ছে

উত্তর:


280

নির্বাচনটি অক্ষম করার কয়েকটি উপায় এখানে রয়েছে:

আপনার মোবাইল ওয়েব নথিতে নিম্নলিখিতগুলি যুক্ত করুন

<style type="text/css">
* {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/copy in UIWebView */
}
</style>

প্রোগ্রামিয়ালি নিম্নলিখিত জাভাস্ক্রিপ্ট কোড লোড করুন:

NSString * jsCallBack = @"window.getSelection().removeAllRanges();";    
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];

অনুলিপি / অনুলিপি ব্যবহারকারী মেনু:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{    
    if (action == @selector(copy:) ||
        action == @selector(paste:)||
        action == @selector(cut:)) 
    {
        return _copyCutAndPasteEnabled;
    }
    return [super canPerformAction:action withSender:sender];
}

1
UIWebViewএকটি বিভাগ ব্যবহার করে প্রসারিত করুন ।
দীপক দান্দুপ্রোলু

4
ইঞ্জিন, প্রথমটি মোবাইল সাফারি, আইওএস ৪.৩.১ এ কাজ করে। তবে রাইটসিসিএস নির্বাচককে যুক্ত করতে ভুলে গেছেন। এটি সমস্ত উপাদানগুলিতে প্রয়োগ করতে, তারকাচিহ্নগুলি ব্যবহার করুন, যেমন: * {/ * সিএসএস এখানে যায় * /}
নক্ষত্রটি

1
শৈলী যুক্ত করা আমার ফোনগ্যাপ অ্যাপ্লিকেশনটির অভ্যন্তরে কোনও লিঙ্কে ট্যাপহোল্ড করার সময় উপস্থিত মেনুটি সরিয়ে ফেলার ক্ষেত্রে পুরোপুরি কাজ করেছিল।
স্পটিকাল

7
canPerformActionকাটা, অনুলিপি, মেনু পেস্ট অক্ষম করে না। এবং নির্বাচন করুন, সমস্ত মেনু নির্বাচন করুন। কিভাবে এটি ঠিক করবেন? -webkit-touch-calloutএবং removeAllRangesব্যবহারকারী ইনপুট বিরতি। প্রদত্ত সমস্ত পদ্ধতি ব্যবহার করতে পারবেন না :(
দিমিত্রি

4
এগুলি কোনও নির্বাচিত শৈলী *বিশ্বব্যাপী সুযোগে রাখার সমস্যাটি হ'ল এটি ওয়েব ফর্মগুলিতে ব্যবহারকারীদের ইনপুটটি থামিয়ে দেয়। আমি তার bodyপরিবর্তে ট্যাগের মধ্যে রেখে ভাল ফলাফল পেয়েছি ।
ডেভিড ডগলাস

104

আমি নিশ্চিত করতে পারি যে নিম্নলিখিত কোডগুলি আইওএস 5.0 - 8.0 এ কাজ করে।

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    // Disable user selection
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    // Disable callout
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

আইওএস 9 এবং তারপরেও কাজ করে। এখানে সুইফট কোডটি রয়েছে:

func webViewDidFinishLoad(webView: UIWebView) {
    // Disable user selection
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect='none'")!
    // Disable callout
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout='none'")!
}

2
আইওএস 7 এ নিশ্চিত! দ্রষ্টব্য: দুটি স্ট্রিংকে সম্মতি জানিয়ে দুটি কলকে এক করে গ্রুপ করা সম্ভব।
বিগুড

উপরের ব্যবহারের পরেও, আইওএস 9.x এ দীর্ঘ প্রেসের পরে একটি খালি কল আউট পর্দার শীর্ষে উপস্থিত হয়।
দ্বারদোহ

আমি উপরের কোডটি কীভাবে ব্যবহার করতে পারি .. আমি কেবল জেএসকে জানি; আমি কীভাবে উদ্দেশ্য সি কোড সম্পাদনা করতে পারি বা ফোনগ্যাপ প্লাগইন পরিবর্তন করতে পারি তার কোনও ধারণা নেই .. যদি কেউ সহায়তা করতে পারে
লক্ষ্যা

আইওএস 9 এবং 10 নিখুঁত লোকের সাথে কাজ করুন!
ΩlostA

25

আমি এই কৌশলটি অ্যান্ড্রয়েড / আইফোন (ট্রিগার.আইওর সাথে প্যাকেজড) এর জন্য একটি ওয়েব অ্যাপ্লিকেশনটিতে ব্যবহার করছি এবং এটি পেয়েছি যে এটি কেবল: (নয়) সিউডো-শ্রেণীর জন্য চেইন সিনট্যাক্সের সাথে কাজ করবে:

*:not(input):not(textarea) {
-webkit-user-select: none; /* disable selection/Copy of UIWebView */
    -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */

}

আমি jQuery মোবাইল এবং ফোনগ্যাপ বিল্ড ব্যবহার করছি এবং এটি আমার জন্য কাজ করেছে। আমি প্রথমে চেষ্টা করেছি *:not(input,textarea) {-webkit-touch-callout: none; -webkit-user-select: none;}, কিন্তু এটি আমার পক্ষে কৌশলটি করেনি। ধন্যবাদ!
মার্ক রুম্মেল

18

আমি রাইটসিসএস সমাধানটি পছন্দ করি তবে আমি এটি ব্যবহার করব যাতে ব্যবহারকারীরা এখনও অনুলিপিগুলিতে অনুলিপি, পেস্ট এবং ক্রিয়া নির্বাচন করতে পারে

<style type="text/css">
*:not(input,textarea) {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/Copy of UIWebView */
}
</style>

2
আপনি যদি এই কাজটি করতে যাচ্ছেন তবে টেক্সারেই ভুলবেন না!
রায়ান

9

কীভাবে সেটআপটি সম্পন্ন হয়েছে তা সম্পর্কে আমি নিশ্চিত নই, তবে ভিউইলডিস্পিয়ারকে কল করার সময় আপনি কেন কেবল পেস্টবোর্ড সাফ করবেন না। আপনার অ্যাপডেলিগেট.এম এর মতো কিছু হতে পারে:

[UIPasteboard generalPasteboard].string = nil;

এটি নিশ্চিত করে দেবে যে ব্যবহারকারীরা যে কোনও ডেটা অনুলিপি করেছেন, তারা এটি অ্যাপের বাইরে পেস্ট করতে সক্ষম হবে না।

এছাড়াও, ইঞ্জিনের মতোই আপনি বলেছেন যে কন্ট্রোলার ক্লাসে ক্যান পারফর্মসিটেক্টর পদ্ধতিতে ইউআইবিউভিউ রয়েছে ওভাররাইড করতে পারেন।


1
এটি সেরা সমাধানগুলির মধ্যে একটি। এটি সেট করা যেতে পারে - (বাতিল) অ্যাপ্লিকেশনডিডনারব্যাকগ্রাউন্ড: (ইউআইএএপ্লিকেশন *) অ্যাপ্লিকেশন ইভেন্ট হ্যান্ডলার। এবং এটি নিশ্চিত করে যে কোনও ডেটা অ্যাপের বাইরে চলে যায় না।
কৃষ্ণন

@ কৃষ্ণ, আপনি কি 100% নিশ্চিত যে স্ক্রিনশটগুলিও বন্ধ করে দেবে?
নরম্যান এইচ

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

এটিও কি অ্যাপ থেকে ডেটা সরিয়ে ফেলবে না? সম্ভবত তথ্য উপস্থিত হতে পারে এবং এটি গায়েব করার জন্য এটি আবার সেট করে
হামজা মালেক

7

টিপোশেলের উত্তরটি তাত্পর্যপূর্ণ তবে আমার ক্ষেত্রে আদেশটি গুরুত্বপূর্ণ ছিল।

// this works - locks selection and callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

// this doesn't work - locks only callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
}

7

আমি নিশ্চিত করতে পারি যে এটি অবশ্যই আপনার জন্য কাজ করবে।

<style type="text/css">
  *:not(input):not(textarea) {
   -webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
   }       
</style>

আপনি চাইলে কেবল অ্যাঙ্কর বোতাম ট্যাগটি অক্ষম করুন।

    a {-webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
     }

5

এক সপ্তাহের জন্য দুর্দান্ত কাজের ফলাফল! আপনি অনেক পৃষ্ঠায় মাউস ইভেন্ট এবং ব্যবহারকারীর ইনপুট সংরক্ষণ করতে চাইলে অন্য সমস্ত উত্তর ভুল।

1) সুইজল পদ্ধতি ( ভাড়াটিয়া / জার্সুইজল গ্রন্থাগার দ্বারা):

[NSClassFromString(@"UIWebDocumentView") jr_swizzleMethod:@selector(canPerformAction:withSender:) withMethod:@selector(myCanPerformAction:withSender:) error:nil];

NSObject + + myCanPerformAction.h:

@interface NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender;

@end

NSObject + + myCanPerformAction.m:

#import "NSObject+myCanPerformAction.h"

@implementation NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(copy:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    if (action == @selector(paste:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    return NO;
}

@end

2) ইউআইভিউতে ইউআইউইউবভিউ রাখুন এবং একটি কোড যুক্ত করুন:

    UITapGestureRecognizer* singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease];
    singleTap.numberOfTapsRequired = 2;
    singleTap.numberOfTouchesRequired = 1;
    singleTap.delegate = self;
    [self.view addGestureRecognizer:singleTap];

এবং এটি:

- (void)handleSingleTap:(UIGestureRecognizer*)gestureRecognizer {
    return;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        UITapGestureRecognizer *gesture = (UITapGestureRecognizer *)otherGestureRecognizer;
        if (gesture.numberOfTapsRequired == 2) {
            [otherGestureRecognizer.view removeGestureRecognizer:otherGestureRecognizer];
        }
    }
    return YES;
}

2
এটি করার কথা বলে কিছু ব্যাখ্যা সুন্দর হবে। বিশেষত, আপনার অঙ্গভঙ্গিকে কেন সিঙ্গলট্যাপ বলা হয় সে সম্পর্কে আমি বিভ্রান্ত কিন্তু দুটি ট্যাপের দরকার।
আরলোমেডিয়া

5
    let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: nil, action: nil)
    longPress.minimumPressDuration = 0.2
    webView.addGestureRecognizer(longPress)

কেবল আপনার ভিউডিডলড () এ এই কোডটি যুক্ত করুন। ব্যবহারকারী লিঙ্কে ক্লিক করতে পারেন তবে সামগ্রীটি অনুলিপি করতে পারবেন না।


4

প্রদত্ত প্রথম সমাধানটি আমার জন্য নিখুঁতভাবে কাজ করেছিল ... যতক্ষণ না আমি আমার ইউআইবিউব ভিউতে একটি .পিডিএফ লোড করি।

একটি .ডোক ফাইল লোড করা নিখুঁতভাবে কাজ করে তবে একটি .পিডিএফ লোড করার ফলে নিম্নলিখিত কোডটির লাইনটি আর কাঙ্ক্ষিত প্রভাব ফেলবে না এবং ব্যবহারকারী দ্বারা দীর্ঘ স্পর্শে অনুলিপি / সংজ্ঞায়িত মেনুটি আবার পপ আপ হয়।

    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];

চুল টানার অন্য এক লড়াইয়ের পরে আমি জনি রোকেক্স এর উত্তর পেয়েছি এবং এটি চ্যাম্পের মতো কাজ করেছে। পিডিএফ ফাইলগুলি প্রদর্শন করার সময় অনুলিপি / আটকানো ছাড়া UIWebView

এই বাস্তবায়নের সহজ, প্রতিভা সমাধানের জন্য তাঁকে অনেক ধন্যবাদ !!


2

আমার জন্য, আমি ছবি 'আনতে অভিপ্রেত আছে NSDataথেকে UIWebViewদ্বারাLongPressGesture

তবে ম্যাগনিফায়ার এবং কপি / পেস্ট / কাট সর্বদা আমার ফানক চালানোর আগে ঘটে।

এবং আমি এটি খুঁজে পেয়েছি: এখানে চিত্র বর্ণনা লিখুন

এর অর্থ হ'ল ম্যাগনিফায়ার এবং কপি / পেস্ট / কাটটির সম্পাদনের জন্য 0.5 টি প্রয়োজন, সুতরাং যদি আপনার ফানক 0.49 সেকেন্ডে কার্যকর করা যায়, না!

self.longPressPan.minimumPressDuration = 0.3

এটি আইওএস 9 + এক্সকোড 7 জিএম এ আমার জন্য কাজ করে, আমি চেষ্টা করেছি এমন অন্যান্য পদ্ধতিগুলি আইওএস 7 এবং 8 এ কেবল কার্যকর
কায়ুয়ান Xu

-4

ওয়েব ভিউ ইন্টিরিশন ফাংশনটি ব্যবহার করুন

   webView.userInteractionEnabled = false

এটা আমার জন্য কাজ করে

পিএস: আপনি যখন ব্যবহারকারী আবার ওয়েব ভিউয়ের সাথে ইন্টারঅ্যাক্ট করতে চান তখন ইন্টারঅ্যাকশনটি সক্ষম করতে মনে রাখবেন


1
স্ট্যাকওভারফ্লোতে স্বাগতম। উত্তর কি এই পুরানো প্রশ্নের মান যুক্ত করে? কিভাবে উত্তর দিতে দয়া করে পর্যালোচনা করুন ।
14bb

1
আপনার উত্তরের মান বাড়ানোর জন্য আপনার উত্তরটি প্রসারিত করার জন্য (কিছু ছোট কোড উদাহরণ সরবরাহ করে) বিবেচনা করুন। এছাড়াও, 'এটি আমার পক্ষে কাজ করে' সম্বলিত উত্তরগুলি সত্যিকার অর্থে আত্মবিশ্বাসের প্রেরণা দেয় না - উত্তরটি যেমন হয় তেমনটি উপস্থাপন করা ভাল এবং তারপরে কেউ যদি আপনার উত্তর সম্পর্কে স্পষ্টতা জিজ্ঞাসা করে তবে সমস্যা সমাধান করুন।
অ্যারন ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.