আইওএস অ্যাপ্লিকেশনটিতে সর্বাধিক দেখা / উইন্ডোর রেফারেন্স পাওয়া


97

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

_topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];

এটি কি কোনও আইওএস অ্যাপ্লিকেশনের জন্য কাজ করবে বা তাদের শীর্ষস্থান দেখার জন্য নিরাপদ / আরও ভাল উপায়?

উত্তর:


36

সাধারণত এটি আপনাকে শীর্ষ দর্শন দেবে, তবে এটির ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার কোনও গ্যারান্টি নেই। এটি স্ক্রিনের বাইরে থাকতে পারে, ০.০ এর একটি আলফা থাকতে পারে বা উদাহরণস্বরূপ 0x0 আকারের হতে পারে।

এটিও হতে পারে যে কী উইন্ডোর কোনও সাবভিউ নেই, তাই সম্ভবত আপনার প্রথমে এটি পরীক্ষা করা উচিত। এটি অস্বাভাবিক হবে, তবে এটি অসম্ভব নয়।

ইউআইভিউন্ডো হ'ল ইউআইভিউর একটি সাবক্লাস, সুতরাং আপনি যদি নিশ্চিত হন যে আপনার বিজ্ঞপ্তিটি ব্যবহারকারীর কাছে দৃশ্যমান রয়েছে তবে আপনি এটি ব্যবহার করে সরাসরি কী উইন্ডোতে যুক্ত করতে পারেন addSubview:এবং এটি তাত্ক্ষণিকভাবে শীর্ষ সর্বাধিক দেখা হবে। আপনি যদিও এটি করতে চাইছেন তা নিশ্চিত কিনা তা নিশ্চিত is (আপনার প্রশ্নের ভিত্তিতে, দেখে মনে হচ্ছে আপনি ইতিমধ্যে এটি জানেন know)


111

যখনই আমি অন্য সমস্ত কিছুর উপরে কিছু ওভারলে প্রদর্শন করতে চাই, আমি কেবল এটি সরাসরি অ্যাপ্লিকেশন উইন্ডোর উপরে যুক্ত করব:

[[[UIApplication sharedApplication] keyWindow] addSubview:someView]

9
প্রতিকৃতি সজ্জাতে শুধু কাজ করে .. আপনি ভালো ঘুর্ণন ইত্যাদি যত্নশীল হবে: stackoverflow.com/questions/2508630/...
hfossli

4
আমি (null)আমার আইওএস -8 অ্যাপে আসছি (স্টোরিবোর্ড ইস্যু?) কোনও ইঙ্গিত? ধন্যবাদ! (দ্রষ্টব্য: সময় এবং সময় (null)উভয়ই ফিরে এসেছিল । অনেক দেরি হয়ে গেছেviewDidLoadviewWillAppear:viewDidAppear:
অলি

যখন আমরা একটি ভিউ কন্ট্রোলার উপস্থাপন করি তখন কি এই কাজ করে? উপস্থাপিত ভিউ নিয়ন্ত্রকের উপরে সংযুক্ত সাবউভিউটি প্রদর্শিত হবে?
প্রত্যুষা তেরেলি

এটি কীবোর্ডের উপরে উঠবে না, সর্বশেষঅবজেক্টটি করলেও।
সের পাউন্স 23

এই কাঠামোটি সমস্ত দিকনির্দেশে কাজ করতে পারে। এবং কীবোর্ড উপরে যেতে হবে। github.com/HarrisonXi/ শীর্ষস্থান দেখুন
হ্যারিসন Xi

47

সমস্যার দুটি অংশ রয়েছে: শীর্ষ উইন্ডো, শীর্ষ উইন্ডোতে শীর্ষ দৃশ্য।

সমস্ত বিদ্যমান উত্তরগুলি উপরের উইন্ডো অংশটি মিস করেছে। তবে [[UIApplication sharedApplication] keyWindow]শীর্ষ উইন্ডো হওয়ার নিশ্চয়তা নেই।

  1. উপরের জানালা. windowLevelকোনও অ্যাপের জন্য একই সহাবস্থানযুক্ত দুটি উইন্ডো থাকবে তা খুব কমই অসম্ভব , তাই আমরা সমস্ত উইন্ডোকে বাছাই করতে windowLevelএবং শীর্ষতমটি পেতে পারি।

    UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
        return win1.windowLevel - win2.windowLevel;
    }] lastObject];
    
  2. শীর্ষ উইন্ডোতে শীর্ষ দৃশ্য। শুধু সম্পূর্ণ হতে হবে। ইতিমধ্যে প্রশ্নের মধ্যে নির্দেশিত:

    UIView *topView = [[topWindow subviews] lastObject];
    

4
ইউআইএলআর্টভিউগুলি একবার খেলতে এলে এই সমাধানটি আমার পক্ষে কাজ করা বন্ধ করে দিয়েছে - মনে হয় তারা কোনও এমটিপি ইউআই উইন্ডোকে পেছনে ফেলে রেখেছিল, তাই আমি আবার ফিরে গেলামtopView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
জেরিয়ন

4
কীবোর্ড আপ থাকলে এটি কাজ করে না। যেহেতু এটি শীর্ষতম উইন্ডো হতে চলেছে
এন্ট্রপি করুন

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

আইওএস 8 এর ক্ষেত্রে শীর্ষ উইন্ডো মানটি যথাযথ নয়
মেহুল ঠাকর

11

আসলে আপনার আবেদনে একাধিক ইউআই উইন্ডো থাকতে পারে। উদাহরণস্বরূপ, যদি কোনও কীবোর্ড তখন স্ক্রিনে থাকে[[UIApplication sharedApplication] windows] থাকে তবে কমপক্ষে দুটি উইন্ডো থাকবে (আপনার কী-উইন্ডো এবং কীবোর্ড উইন্ডো)।

সুতরাং আপনি যদি নিজের দৃষ্টিভঙ্গি উভয়ের উপরে উঠে আসতে চান তবে আপনাকে এমন কিছু করতে হবে:

[[[[UIApplication sharedApplication] windows] lastObject] addSubview:view];

(ধরে নিলাম লাস্টঅবজেক্টে উইন্ডোটি সর্বাধিক উইন্ডো লেভেল অগ্রাধিকার সহ রয়েছে)।


[[[ইউআইএএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন] উইন্ডোজ] লাস্টঅবজেক্ট] আইওএস 8 এর ক্ষেত্রে মান যথাযথ নয়
মেহুল ঠাক্কার

আমি এটি ব্যবহার শুরু করেছি, তবে মনে হয় কখনও কখনও কীবোর্ড উইন্ডোটি উপস্থিত থাকে তবে প্রদর্শিত হয় না এবং তারপরে আমার ভিউটি প্রদর্শিত হয় না!
তেরডাইল

3

আমি শিরোনামটি বলেছি এবং আলোচনাকে নয় বলে প্রশ্নটিতে আঁকছি। কোন নির্দিষ্ট বিন্দুতে কোন দৃশ্য শীর্ষে দৃশ্যমান?

@implementation UIView (Extra)

- (UIView *)findTopMostViewForPoint:(CGPoint)point
{
    for(int i = self.subviews.count - 1; i >= 0; i--)
    {
        UIView *subview = [self.subviews objectAtIndex:i];
        if(!subview.hidden && CGRectContainsPoint(subview.frame, point))
        {
            CGPoint pointConverted = [self convertPoint:point toView:subview];
            return [subview findTopMostViewForPoint:pointConverted];
        }
    }

    return self;
}

- (UIWindow *)topmostWindow
{
    UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
        return win1.windowLevel - win2.windowLevel;
    }] lastObject];
    return topWindow;
}

@end

রিসিভার হিসাবে যে কোনও ইউআই উইন্ডো বা রিসিভার হিসাবে কোনও ইউআইভিউয়ের সাথে সরাসরি ব্যবহার করা যেতে পারে।


শীর্ষ উইন্ডো আইওএস 8 এর ক্ষেত্রে ভুল মূল্য দিচ্ছে, আপনি দয়া করে আইওএস 8 এর জন্য নিজের উত্তরটি আপডেট করতে পারেন
মেহুল ঠাক্কার

4
আমার জানার মতো সময় নেই। আপনি যদি করেন তবে আপনি এই পোস্টটি আপডেট করতে নির্দ্বিধায় আছেন।
hfossli

1

আপনি যদি কোনও লোডিং ভিউ যুক্ত করছেন (উদাহরণস্বরূপ কোনও ক্রিয়াকলাপ সূচক দর্শন), আপনার ইউআই উইন্ডো শ্রেণীর কোনও অবজেক্ট রয়েছে তা নিশ্চিত করুন। আপনি নিজের লোডিং ভিউটি দেখানোর ঠিক আগে যদি কোনও অ্যাকশনশিট দেখান তবে keyWindowতা হবে UIActionSheetএবং হবে না UIWindow। এবং যেহেতু অ্যাকশনশিটটি চলে যাবে, লোডিং ভিউটি এটি দিয়ে চলে যাবে। বা এটিই আমাকে সমস্যা তৈরি করছিল।

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if (![NSStringFromClass([keyWindow class]) isEqualToString:@"UIWindow"]) {
    // find uiwindow in windows
    NSArray *windows = [UIApplication sharedApplication].windows;
    for (UIWindow *window in windows) {
        if ([NSStringFromClass([window class]) isEqualToString:@"UIWindow"]) {
            keyWindow = window;
            break;
        }
    }
}

1

যদি আপনার অ্যাপ্লিকেশনটি কেবল প্রতিকৃতি নির্দেশে কাজ করে তবে এটি যথেষ্ট:

[[[UIApplication sharedApplication] keyWindow] addSubview:yourView]

এবং আপনার দৃশ্য কীবোর্ড এবং স্থিতি দণ্ডের উপরে প্রদর্শিত হবে না।

আপনি যদি শীর্ষস্থানীয় দর্শন পেতে চান যা কীবোর্ড বা স্থিতি দণ্ডের উপরে, বা আপনি চান যে শীর্ষস্থানীয় দর্শনটি ডিভাইসগুলির সাথে সঠিকভাবে ঘোরানো যায়, দয়া করে এই কাঠামোটি চেষ্টা করুন:

https://github.com/HarrisonXi/ শীর্ষস্থানীয় দেখুন V

এটি iOS7 / 8/9 সমর্থন করে।


0

আপনি যদি স্ক্রিনের সমস্ত কিছুর উপরে একটি ভিউ যুক্ত করতে চান তবে এই কোডটি ব্যবহার করুন।

[[UIApplication sharedApplication].keyWindow addSubView: yourView];

0

এটা চেষ্টা কর

UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];

উইন্ডোজের বৈশিষ্ট্য সম্পর্কে: "এই সম্পত্তিটিতে অ্যাপ্লিকেশনের জন্য বিদ্যমান সমস্ত উইন্ডোগুলির সাথে সম্পর্কিত এনএস উইন্ডো অবজেক্টগুলির একটি অ্যারে রয়েছে The অ্যারেটিতে সমস্ত অনস্ক্রিন এবং অফস্ক্রিন উইন্ডোজ অন্তর্ভুক্ত রয়েছে, সেগুলি যে কোনও জায়গাতে দৃশ্যমান কিনা তা the অর্ডারটির কোনও গ্যারান্টি নেই There অ্যারেতে উইন্ডোগুলির। "
স্টিভেন ফিশার

0
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if (![NSStringFromClass([keyWindow class]) isEqualToString:@"UIWindow"]) {

    NSArray *windows = [UIApplication sharedApplication].windows;
    for (UIWindow *window in windows) {
        if ([NSStringFromClass([window class]) isEqualToString:@"UIWindow"]) {
            keyWindow = window;
            break;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.