আমি কীভাবে স্বচ্ছ ইউআইভিউয়ের পিছনে একটি বোতামটি ক্লিক করতে পারি?


177

ধরা যাক আমাদের কাছে একটি উপ-ভিউ সহ একটি ভিউ কন্ট্রোলার রয়েছে। সাবভিউটি চারদিকে 100 পিক্সেল মার্জিন সহ পর্দার কেন্দ্র গ্রহণ করে। তারপরে আমরা সেই সাবভিউয়ের ভিতরে ক্লিক করতে সামান্য জিনিসপত্রের একগুচ্ছ যুক্ত করি। আমরা কেবলমাত্র নতুন ফ্রেমের সুবিধা নিতে সাবউইউটি ব্যবহার করছি (সাবভিউয়ের মধ্যে x = 0, y = 0 আসলে প্যারেন্ট ভিউতে 100,100)।

তারপরে, কল্পনা করুন যে আমাদের কাছে মেনুটির মতো সাবভিউয়ের পিছনে কিছু রয়েছে। আমি চাই যে ব্যবহারকারী সাবউভিউতে যে কোনও "সামান্য জিনিস" নির্বাচন করতে সক্ষম হবে, তবে যদি সেখানে কিছুই না থাকে তবে আমি তার পিছনে থাকা বোতামগুলিতে স্পর্শ করতে চাই (যেহেতু ব্যাকগ্রাউন্ডটি যাইহোক পরিষ্কার)।

কিভাবে আমি এটি করতে পারব? দেখে মনে হচ্ছে টাচবেগান দিয়ে গেছে তবে বোতামগুলি কাজ করে না।


1
আমি ভেবেছিলাম স্বচ্ছ (আলফা 0) ইউআইভিউগুলি স্পর্শ ইভেন্টগুলিতে সাড়া দেওয়ার কথা নয়?
ইভাদনে উ

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

উত্তর:


315

আপনার ধারকটির জন্য একটি কাস্টম ভিউ তৈরি করুন এবং পয়েন্টটি ওভাররাইড করুন ইনসাইড: পয়েন্টটি কোনও উপযুক্ত শিশু দর্শনের মধ্যে না থাকলে মিথ্যা ফেরত পাঠানোর বার্তা:

সুইফট:

class PassThroughView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        for subview in subviews {
            if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) {
                return true
            }
        }
        return false
    }
}

উদ্দেশ্য গ:

@interface PassthroughView : UIView
@end

@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *view in self.subviews) {
        if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
            return YES;
    }
    return NO;
}
@end

এই দৃশ্যটি একটি ধারক হিসাবে ব্যবহার করা এর কোনও শিশুকে ছোঁয়া দেওয়ার অনুমতি দেবে তবে দৃশ্যটি নিজেই ইভেন্টগুলির জন্য স্বচ্ছ হবে।


4
মজাদার. আমাকে আরও উত্তরদাতাদের শৃঙ্খলে ডুব দেওয়া দরকার।
শন ক্লার্ক হেস

1
আপনার ভিউটিও দৃশ্যমান কিনা তা পরীক্ষা করে দেখতে হবে, তবে তাদের পরীক্ষা করার আগে সাবউভিউগুলি দৃশ্যমান কিনা তাও আপনাকে পরীক্ষা করতে হবে।
অলস কোডার

2
দুর্ভাগ্যক্রমে এই কৌশলটি একটি ট্যাববারকন্ট্রোলারের পক্ষে কাজ করে না, যার জন্য দর্শন পরিবর্তন করা যায় না। এই দৃষ্টিভঙ্গিটিও ইভেন্টে স্বচ্ছ করতে কারও ধারণা আছে?
সাইরিলচ্যাম্পিয়ার

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

2
আমি একটি দ্রুত সংস্করণ করেছি: সম্ভবত আপনি এটিকে দৃশ্যমানতার উত্তরে অন্তর্ভুক্ত করতে পারেন gist.github.com/eyeballz/17945454447c7ae766cb
eyeballz

107

আমিও ব্যবহার করি

myView.userInteractionEnabled = NO;

সাবক্লাস করার দরকার নেই। ঠিকভাবে কাজ করে.


76
এটি কোনও সংক্ষিপ্তসারগুলির জন্য ব্যবহারকারীর মিথস্ক্রিয়াকে অক্ষম করে দেবে
পিক্সেলফ্রেইক

@ পিক্সেলফেরিয়াক যেমন উল্লেখ করেছেন, এটি সব ক্ষেত্রেই আদর্শ সমাধান নয়। যে দৃশ্যের সেই দৃশ্যের সাবউভিউগুলিতে ইন্টারঅ্যাকশনটি এখনও পছন্দসই রয়েছে সেই পতাকাটি সক্ষম থাকা দরকার।
অগস্টো কারমো

20

অ্যাপল থেকে:

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

আপেল সেরা অনুশীলন :

প্রতিক্রিয়াশীল চেইনকে (স্পষ্টরূপে ইভেন্টগুলি প্রেরণ করবেন না (পরের রেসপন্ডারের মাধ্যমে); পরিবর্তে, সুপারক্লাস বাস্তবায়নের জন্য অনুরোধ করুন এবং UIKit কে প্রতিক্রিয়াশীল-চেইন ট্র্যাভারসাল পরিচালনা করতে দিন।

পরিবর্তে আপনি ওভাররাইড করতে পারেন:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

আপনার ইউআইভিউ সাবক্লাসে এবং যদি আপনি সেই স্পর্শটি প্রতিক্রিয়াশীল চেইন প্রেরণ করতে চান তবে (কোনও কিছুই ছাড়াই আপনার দৃষ্টিভঙ্গির পিছনে মতামতগুলি) return


1
আপনি যে দস্তাবেজের সাথে উদ্ধৃতি দিচ্ছেন তার সাথে নিজের উদ্ধৃতিগুলির সাথে একটি লিঙ্ক পাওয়া খুব দুর্দান্ত হবে।
মরগানকোডস

1
আমি আপনার জন্য ডকুমেন্টেশনে প্রাসঙ্গিক জায়গাগুলির লিঙ্কগুলি যুক্ত করেছি
জ্যাকস্ল্যাশ

1
Over কীভাবে ওভাররাইডটি দেখতে হবে তা আপনি প্রদর্শন করতে পারেন? This এটি কীভাবে দেখাবে তার অন্য একটি প্রশ্নের উত্তর পেয়েছেন ; এটি আক্ষরিকভাবে ফিরে আসছে NO;
কনটুর

এটি সম্ভবত গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সহজতম উপায় এবং প্রস্তাবিত উপায়।
ইকুয়েডর

8

খুব সহজ উপায় হল ইন্টারফেস বিল্ডারে "আন-চেক" ব্যবহারকারীর ইন্টারঅ্যাকশন সক্ষম করা। "আপনি যদি স্টোরিবোর্ড ব্যবহার করেন"

এখানে চিত্র বর্ণনা লিখুন


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

6

জন যা পোস্ট করেছেন তার উপর ভিত্তি করে তৈরি করা, এখানে একটি উদাহরণ যা স্পর্শ ইভেন্টগুলিকে বোতামগুলি বাদে কোনও দৃশ্যের সমস্ত সাবভিউ দিয়ে যেতে দেবে:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // Allow buttons to receive press events.  All other views will get ignored
    for( id foundView in self.subviews )
    {
        if( [foundView isKindOfClass:[UIButton class]] )
        {
            UIButton *foundButton = foundView;

            if( foundButton.isEnabled  &&  !foundButton.hidden &&  [foundButton pointInside:[self convertPoint:point toView:foundButton] withEvent:event] )
                return YES;
        }        
    }
    return NO;
}

দৃশ্যটি দৃশ্যমান কিনা এবং সাব-ভিউগুলি দৃশ্যমান কিনা তা পরীক্ষা করে দেখার প্রয়োজন।
অলস কোডার

নিখুঁত সমাধান! এমনকি কোনও সহজ পন্থা এমন একটি UIViewসাবক্লাস তৈরি করা হবে PassThroughViewযা -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }যদি আপনি কোনও স্পর্শ ইভেন্টকে নীচের দৃষ্টিতে ফরোয়ার্ড করতে চান তবে কেবল ওভাররাইড হয় ।
auco

6

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

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

জিআইএফ

আপনি জিআইএফ-তে দেখতে পাচ্ছেন, জিরাফ বোতামটি একটি সাধারণ আয়তক্ষেত্র তবে স্বচ্ছ অঞ্চলে স্পর্শ ইভেন্টগুলি UIButtonনীচে হলুদে প্রেরণ করা হয় ।

ক্লাসে লিঙ্ক


1
যদিও এই সমাধানটি কাজ করতে পারে, আপনার সমাধানের প্রাসঙ্গিক অংশ উত্তরের মধ্যে রাখাই ভাল better
কোয়েন

4

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

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *view = [super hitTest:point withEvent:event];
    if (view == self) {
        return nil; //avoid delivering touch events to the container view (self)
    }
    else{
        return view; //the subviews will still receive touch events
    }
}

3

সুইফট 3

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    for subview in subviews {
        if subview.frame.contains(point) {
            return true
        }
    }
    return false
}

2

'আইফোন অ্যাপ্লিকেশন প্রোগ্রামিং গাইড' অনুসারে:

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

http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html

আপডেট হয়েছে : সরানো উদাহরণ - প্রশ্নটি আবার পড়ুন ...

বোতামটি উঠার আগে আপনি যে ভিউগুলি ট্যাপগুলি প্রসেস করতে পারেন তাতে কোনও অঙ্গভঙ্গি প্রক্রিয়াজাতকরণ আছে? আপনার যখন স্বচ্ছ দৃষ্টিভঙ্গিটি না থাকে তখন কী বোতামটি কাজ করে?

অ-কার্যকারী কোডের কোনও কোড নমুনা?


হ্যাঁ, আমি আমার প্রশ্নে লিখেছিলাম যে স্বাভাবিক স্পর্শগুলি নীচের দৃষ্টিতে কাজ করে তবে ইউআইবাটন এবং অন্যান্য উপাদানগুলি কাজ করে না।
সান ক্লার্ক হেস

1

আমি যতদূর জানি, আপনি হিট টেস্ট: পদ্ধতিটি ওভাররাইড করে এটি করতে সক্ষম হবেন বলে মনে করা হচ্ছে । আমি চেষ্টা করেছিলাম তবে এটি সঠিকভাবে কাজ করতে পারিনি।

শেষ পর্যন্ত আমি স্পর্শযোগ্য বস্তুর চারপাশে স্বচ্ছ দৃষ্টিভঙ্গির একটি সিরিজ তৈরি করেছি যাতে তারা এটি আবরণ না করে। আমার ইস্যুটির জন্য একটি হ্যাকের বিটটি এটি ভাল কাজ করেছে।


1

অন্যান্য উত্তরগুলির টিপস গ্রহণ করে এবং অ্যাপলের ডকুমেন্টেশনগুলি পড়ে, আমি আপনার সমস্যা সমাধানের জন্য এই সাধারণ লাইব্রেরিটি তৈরি করেছি:
https://github.com/nat
Microsoft/NATouchThroughView এটি ইন্টারফেস বিল্ডারে এমন দৃষ্টিভঙ্গি আঁকাকে সহজ করে তোলে যেগুলি স্পর্শ করে যেতে পারে to অন্তর্নিহিত ভিউ

আমি মনে করি পদ্ধতি সুইজলিং অত্যধিক কিল এবং উত্পাদন কোডে করা অত্যন্ত বিপজ্জনক কারণ আপনি সরাসরি অ্যাপলের বেস বাস্তবায়নের সাথে ঝামেলা করছেন এবং অ্যাপ্লিকেশন-বিস্তৃত পরিবর্তন করছেন যা অনিচ্ছাকৃত পরিণতির কারণ হতে পারে।

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


1

এটি করার জন্য আমি একটি বিভাগ তৈরি করেছি।

একটি সামান্য পদ্ধতি swizzling এবং দেখুন সোনার is

শিরোনাম

//UIView+PassthroughParent.h
@interface UIView (PassthroughParent)

- (BOOL) passthroughParent;
- (void) setPassthroughParent:(BOOL) passthroughParent;

@end

বাস্তবায়ন ফাইল

#import "UIView+PassthroughParent.h"

@implementation UIView (PassthroughParent)

+ (void)load{
    Swizz([UIView class], @selector(pointInside:withEvent:), @selector(passthroughPointInside:withEvent:));
}

- (BOOL)passthroughParent{
    NSNumber *passthrough = [self propertyValueForKey:@"passthroughParent"];
    if (passthrough) return passthrough.boolValue;
    return NO;
}
- (void)setPassthroughParent:(BOOL)passthroughParent{
    [self setPropertyValue:[NSNumber numberWithBool:passthroughParent] forKey:@"passthroughParent"];
}

- (BOOL)passthroughPointInside:(CGPoint)point withEvent:(UIEvent *)event{
    // Allow buttons to receive press events.  All other views will get ignored
    if (self.passthroughParent){
        if (self.alpha != 0 && !self.isHidden){
            for( id foundView in self.subviews )
            {
                if ([foundView alpha] != 0 && ![foundView isHidden] && [foundView pointInside:[self convertPoint:point toView:foundView] withEvent:event])
                    return YES;
            }
        }
        return NO;
    }
    else {
        return [self passthroughPointInside:point withEvent:event];// Swizzled
    }
}

@end

আপনি আমার Swizz.h এবং Swizz.m যোগ করতে হবে

এখানে অবস্থিত

এর পরে, আপনি কেবলমাত্র আপনার {প্রকল্প} -প্রিফিক্স.পিচ ফাইলে ইউআইভিউ + পাস্ত্রহ্রোপ্রেন্ট.এইচটি আমদানি করুন এবং প্রতিটি দৃশ্যের এই ক্ষমতা থাকবে।

প্রতিটি দর্শন পয়েন্ট নেবে, তবে ফাঁকা স্থানের কোনওটাই হবে না।

আমি একটি পরিষ্কার ব্যাকগ্রাউন্ড ব্যবহার করার পরামর্শ দিচ্ছি।

myView.passthroughParent = YES;
myView.backgroundColor = [UIColor clearColor];

সম্পাদনা

আমি আমার নিজস্ব সম্পত্তি ব্যাগ তৈরি করেছি এবং এটি আগে অন্তর্ভুক্ত ছিল না।

শিরোনাম ফাইল

// NSObject+PropertyBag.h

#import <Foundation/Foundation.h>

@interface NSObject (PropertyBag)

- (id) propertyValueForKey:(NSString*) key;
- (void) setPropertyValue:(id) value forKey:(NSString*) key;

@end

বাস্তবায়ন ফাইল

// NSObject+PropertyBag.m

#import "NSObject+PropertyBag.h"



@implementation NSObject (PropertyBag)

+ (void) load{
    [self loadPropertyBag];
}

+ (void) loadPropertyBag{
    @autoreleasepool {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Swizz([NSObject class], NSSelectorFromString(@"dealloc"), @selector(propertyBagDealloc));
        });
    }
}

__strong NSMutableDictionary *_propertyBagHolder; // Properties for every class will go in this property bag
- (id) propertyValueForKey:(NSString*) key{
    return [[self propertyBag] valueForKey:key];
}
- (void) setPropertyValue:(id) value forKey:(NSString*) key{
    [[self propertyBag] setValue:value forKey:key];
}
- (NSMutableDictionary*) propertyBag{
    if (_propertyBagHolder == nil) _propertyBagHolder = [[NSMutableDictionary alloc] initWithCapacity:100];
    NSMutableDictionary *propBag = [_propertyBagHolder valueForKey:[[NSString alloc] initWithFormat:@"%p",self]];
    if (propBag == nil){
        propBag = [NSMutableDictionary dictionary];
        [self setPropertyBag:propBag];
    }
    return propBag;
}
- (void) setPropertyBag:(NSDictionary*) propertyBag{
    if (_propertyBagHolder == nil) _propertyBagHolder = [[NSMutableDictionary alloc] initWithCapacity:100];
    [_propertyBagHolder setValue:propertyBag forKey:[[NSString alloc] initWithFormat:@"%p",self]];
}

- (void)propertyBagDealloc{
    [self setPropertyBag:nil];
    [self propertyBagDealloc];//Swizzled
}

@end

পাসথ্রুপয়েন্টআইনসাইড পদ্ধতিটি আমার পক্ষে ভাল কাজ করছে (এমনকি পাসথ্রুপ্রেন্ট বা সুইজ স্টাফের কোনওটি ব্যবহার না করেই - কেবল পাসথ্রুপয়েন্টটি ইনসাইড টু পয়েন্টইনসাইডের নামকরণ করা হয়েছে), অনেক ধন্যবাদ thanks
বেনজমিন পিট

সম্পত্তি ভ্যালুফোরকি কী?
স্কটিচ

1
হুম। এর আগে কেউ তা দেখায়নি। আমি একটি কাস্টম পয়েন্টার অভিধান তৈরি করেছি যা ক্লাস এক্সটেনশনে বৈশিষ্ট্য রাখে। আমি এখানে এটি অন্তর্ভুক্ত করার জন্য এটি খুঁজে পেতে পারি কিনা তা আমি দেখতে পাচ্ছি।
অলস কোডার

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

0

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


2
হাই, ওভারফ্লো স্ট্যাক করতে স্বাগতম নতুন ব্যবহারকারী হিসাবে আপনার জন্য কেবল একটি ইঙ্গিত: আপনি আপনার স্বর সম্পর্কে সতর্ক থাকতে চাইতে পারেন। "যদি আপনি বিরক্ত না করতে পারেন" এর মতো বাক্যগুলি এড়াতে চাই; এটি
সংমিশ্রিত

মাথা আপ জন্য ধন্যবাদ .. এটি ঘনীভূত চেয়ে অলস দৃষ্টিভঙ্গি থেকে আরও ছিল, কিন্তু পয়েন্ট গৃহীত।
সায়াগকে কাঁপানো

0

এটা চেষ্টা কর

class PassthroughToWindowView: UIView {
        override func test(_ point: CGPoint, with event: UIEvent?) -> UIView? {
            var view = super.hitTest(point, with: event)
            if view != self {
                return view
            }

            while !(view is PassthroughWindow) {
                view = view?.superview
            }
            return view
        }
    } 

0

backgroundColorআপনার transparentViewহিসাবে একটি সেট করার চেষ্টা করুন UIColor(white:0.000, alpha:0.020)। তারপরে আপনি touchesBegan/ touchesMovedপদ্ধতিতে স্পর্শ ইভেন্টগুলি পেতে পারেন । নীচে কোডটি রাখুন কোথাও আপনার ভিউটি প্রবেশ করানো হয়েছে:

self.alpha = 1
self.backgroundColor = UIColor(white: 0.0, alpha: 0.02)
self.isMultipleTouchEnabled = true
self.isUserInteractionEnabled = true

0

আমি ওভাররাইড পদ্ধতি বিন্দুর পরিবর্তে এটি ব্যবহার করি (ভিতরে: সিজিপিয়েন্ট, এর সাথে: ইউআইইভেন্ট)

  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        guard self.point(inside: point, with: event) else { return nil }
        return self
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.