স্ক্রিনের ওরিয়েন্টেশন-নির্ভর উচ্চতা এবং প্রস্থ কীভাবে পাবেন?


96

আমি আমার অ্যাপ্লিকেশনের বর্তমান উচ্চতা এবং প্রস্থকে প্রোগ্রামগতভাবে নির্ধারণ করার চেষ্টা করছি। আমি এটি ব্যবহার:

CGRect screenRect = [[UIScreen mainScreen] bounds];

তবে ডিভাইস প্রতিকৃতিতে বা ল্যান্ডস্কেপ অভিযোজনে রয়েছে তা নির্বিশেষে এটি 320 প্রস্থ এবং 480 উচ্চতা অর্জন করে। আমি কীভাবে আমার প্রধান স্ক্রিনের বর্তমান প্রস্থ এবং উচ্চতা (ডিভাইস ওরিয়েন্টেশনের উপর নির্ভরশীল) নির্ধারণ করতে পারি ?

উত্তর:


164

UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)ওরিয়েন্টেশন নির্ধারণ করতে এবং তারপরে সেই মাত্রাটি ব্যবহার করার মতো আপনি কিছু ব্যবহার করতে পারেন ।

যাইহোক, ইউআইভিউকন্ট্রোলারের মতো ওরিয়েন্টেশন পরিবর্তনের সময়

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                 duration:(NSTimeInterval)duration

সজ্জাতে পাস ব্যবহার করুন toInterfaceOrientationযেহেতু UIApplication এর statusBarOrientation এখনও পুরানো অভিযোজন নির্দেশ করবে যেমন এখনো পরিবর্তন হয়নি (যেহেতু আপনি একটি ভিতরে করছি willইভেন্ট হ্যান্ডলার)।

সারসংক্ষেপ

এর সাথে সম্পর্কিত বেশ কয়েকটি পোস্ট রয়েছে তবে এগুলির প্রত্যেকটিরই মনে হয় যে আপনাকে করতে হবে:

  1. [[UIScreen mainScreen] bounds]মাত্রা পেতে তাকান ,
  2. আপনি কোন দিকে আছেন সেগুলি পরীক্ষা করুন এবং
  3. স্ট্যাটাস বারের উচ্চতার জন্য অ্যাকাউন্ট (যদি দেখানো হয়)

লিঙ্কগুলি

কার্য কোড

আমি সাধারণত এদিকে যাই না, তবে আপনি আমার আগ্রহ প্রকাশ করেছেন। নিম্নলিখিত কোডটি কৌশলটি করা উচিত। আমি ইউআইএপ্লিকেশন উপর একটি বিভাগ লিখেছি। আমি প্রদত্ত অভিযোজনে বর্তমানের আকার বা আকার পাওয়ার জন্য ক্লাসের পদ্ধতিগুলি যুক্ত করেছি, যা আপনি ইউআইভিউউকন্ট্রোলারে কল করবেন willRotateToInterfaceOrientation:duration:

@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end

@implementation UIApplication (AppDimensions)

+(CGSize) currentSize
{
    return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
    CGSize size = [UIScreen mainScreen].bounds.size;
    UIApplication *application = [UIApplication sharedApplication];
    if (UIInterfaceOrientationIsLandscape(orientation))
    {
        size = CGSizeMake(size.height, size.width);
    }
    if (application.statusBarHidden == NO)
    {
        size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
    }
    return size;
}

@end

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

আশাকরি এটা সাহায্য করবে. : ডি

অন্যান্য চিন্তা

আপনি ইউআইওয়াইন্ডোর rootViewControllerসম্পত্তি দেখে মাত্রা অর্জন করতে পারেন । আমি অতীতে এটি দেখেছি এবং এটি একইভাবে প্রতিকৃতি এবং ল্যান্ডস্কেপ উভয় ক্ষেত্রে একই ঘূর্ণন রূপান্তরিত হওয়ার রিপোর্ট ব্যতীত রিপোর্ট করেছে:

(জিডিবি) পো [[[[ইউআইএ আবেদনটি শেয়ার করেছেন প্রয়োগ] কী উইন্ডো] রুটভিউ নিয়ন্ত্রণকারী] দেখুন]

<ইউআইআইআলআউটকন্টেনারভিউ: 0xf7296f0; ফ্রেম = (0 0; 320 480); রূপান্তর = [0, -1, 1, 0, 0, 0]; autoresize = ডাব্লু + এইচ; স্তর = <ক্যালায়ার: 0xf729b80 >>

(জিডিবি) পো [[[[ইউআইএ আবেদনটি শেয়ার করেছেন প্রয়োগ] কী উইন্ডো] রুটভিউ নিয়ন্ত্রণকারী] দেখুন]

<ইউআইআইআলআউটকন্টেনারভিউ: 0xf7296f0; ফ্রেম = (0 0; 320 480); autoresize = ডাব্লু + এইচ; স্তর = <ক্যালায়ার: 0xf729b80 >>

আপনার অ্যাপ্লিকেশনটি কীভাবে কাজ করে তা নিশ্চিত নয় তবে আপনি যদি কোনও ধরণের নেভিগেশন কন্ট্রোলার ব্যবহার না করেন তবে আপনার মূল দৃশ্যের অধীনে প্যারেন্টের সর্বোচ্চ উচ্চতা / প্রস্থ এবং পিতামাতার সাথে বৃদ্ধি / সঙ্কুচিত থাকতে পারে U তাহলে আপনি করতে পারেন:[[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]। এটি এক লাইনে বেশ তীব্র দেখাচ্ছে, তবে আপনি ধারণা পাবেন get

তবে ... সংক্ষিপ্তসার অনুসারে উপরের 3 টি পদক্ষেপটি করা আরও ভাল হবে। UIWindows এর সাথে জগাখিচুড়ি শুরু করুন এবং আপনি অদ্ভুত জিনিসগুলি খুঁজে পাবেন, যেমন একটি ইউআইএলার্টভিউ দেখানোর ফলে ইউআইএপ্লিকেশনটির কীউইন্ডোটি নতুন ইউআইআই উইন্ডোতে নির্দেশ করবে যা ইউআইএলআর্টভিউ তৈরি করেছে। কে জানত? আমি কী-উইন্ডোতে নির্ভর করে একটি বাগ খুঁজে পেয়েছিলাম এবং আবিষ্কার করেছিলাম যে এটির মতো পরিবর্তন হয়েছে!


4
এটি এমন প্রাথমিক কাজটির মতো বলে মনে হচ্ছে যে বিশ্বাস করতে আমার সমস্যা হচ্ছে আমি এর মতো কিছু নির্ধারণ করতে আমার নিজের কোড হ্যাক করতে হবে।
মুসিজেনিসিস

4
আমি অন্য একটি সমাধান চেষ্টা করব এবং এটি কার্যকর হলে পুনরায় পোস্ট করব। এই সাইটটি এত আক্রমণাত্মক যদি আপনি দ্রুত উত্তর না দেন তবে আপনি উত্তরও দিতে পারেন না। হা হা ...: ডিআই আশা করি আমার উত্তরটি অন্তত সহায়ক। আবার, আমি বাস্তবের দ্রুত অন্য কিছু চেষ্টা করব।
স্যাম

4
দুর্দান্ত! (বিটিডাব্লু, যার যার আগ্রহ রয়েছে) :-)
ভামোস

4
আপনি যদি (ইউআইএস স্ক্রিনে) applicationFrameপরিবর্তে ব্যবহার করেন তবে আপনাকে boundsস্ট্যাটাস বারের উচ্চতা বিয়োগ করতে হবে না।
আফসফান

4
stackoverflow.com/questions/24150359/… mainScreen().bounds.size আইওএস 8 এর পরে ওরিয়েন্টেশন নির্ভর হয়ে উঠেছে
জেরাল্ড

39

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

-(CGRect)currentScreenBoundsDependOnOrientation
{  

    CGRect screenBounds = [UIScreen mainScreen].bounds ;
    CGFloat width = CGRectGetWidth(screenBounds)  ;
    CGFloat height = CGRectGetHeight(screenBounds) ;
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;

    if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
        screenBounds.size = CGSizeMake(width, height);
    }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        screenBounds.size = CGSizeMake(height, width);
    }
    return screenBounds ;
}

দ্রষ্টব্য , আইওএস 8 এর পরে, ইউআইএস স্ক্রিনের সীমানা সম্পত্তি সম্পর্কিত অ্যাপল নথি যেমন বলে:

আলোচনা

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

সুতরাং সামঞ্জস্যতার বিবেচনার জন্য, আমাদের আইওএস সংস্করণটি সনাক্ত করা উচিত এবং নীচের মত পরিবর্তন করা উচিত:

#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

-(CGRect)currentScreenBoundsDependOnOrientation
{  

    CGRect screenBounds = [UIScreen mainScreen].bounds ;
    if(IsIOS8){
        return screenBounds ;
    }
    CGFloat width = CGRectGetWidth(screenBounds)  ;
    CGFloat height = CGRectGetHeight(screenBounds) ;
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;

    if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
        screenBounds.size = CGSizeMake(width, height);
    }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        screenBounds.size = CGSizeMake(height, width);
    }
    return screenBounds ;
}

আমার উত্তর হিসাবে অনেকটা একই, এটি কেবল জিনিস মিস করে যদি এটি প্রতিকৃতিতে উল্টো হয়। এটি কেবল তখনই গুরুত্বপূর্ণ যদি আপনি সেই অভিযোজনকে সমর্থন করেন।
রবার্ট ওয়াগস্টাফ

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

4
@ হাকনবোজেন.আইজস আপনি ঠিকই বলেছেন, কারণ "পেরোপার্টি" ঘোষণার ফলে স্বয়ংক্রিয়ভাবে সেটার / গেটর পদ্ধতি উত্পন্ন হয় এবং এটি নামকরণ বিরোধের দিকে পরিচালিত করতে পারে এবং অবজেক্টের নামকরণের সম্মেলনের বিরুদ্ধে যেতে পারে your আপনার পরামর্শের জন্য ধন্যবাদ।
monjer

এটি দুর্দান্ত যে অ্যাপল অবশেষে স্বাচ্ছন্দ্যে স্বীকার করেছে যে তাদের ঘূর্ণন কোডটি একটি সম্পূর্ণ জগাখিচুড়ি ছিল এবং কেবলমাত্র আমাদের জানাতে শুরু করেছে যে বর্তমানের অভিযোজনে অভিঘাতের মাত্রা কী। ভার্সন 8 পর্যন্ত পৌঁছতে খুব খারাপ লেগেছে।
মুসিজেনেসিস

31

এখানে একটি কার্যকর ম্যাক্রো:

#define SCREEN_WIDTH (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height)
#define SCREEN_HEIGHT (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width)

14

আইওএস 8+ এ আপনার এই viewWillTransitionToSize:withTransitionCoordinatorপদ্ধতিটি ব্যবহার করা উচিত :

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // You can store size in an instance variable for later
    currentSize = size;

    // This is basically an animation block
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        // Get the new orientation if you want
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

        // Adjust your views
        [self.myView setFrame:CGRectMake(0, 0, size.width, size.height)];

    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        // Anything else you need to do at the end
    }];
}

এটি অবমুক্ত অ্যানিমেশন পদ্ধতিটি প্রতিস্থাপন করে যা আকার সম্পর্কে কোনও তথ্য দেয়নি:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আধুনিক এবং আধুনিক।
সার্পের্দাগ

আইওএস 8 এবং উপরের জন্য এই উত্তরটি ব্যবহার করুন।
আইফোন ডেভেলপার

10

আইওএস-এর হিসাবে 8 স্ক্রিনের সীমাগুলি বর্তমান ওরিয়েন্টেশনের জন্য সঠিকভাবে ফিরে এসেছে। এর অর্থ ল্যান্ডস্কেপ অভিমুখীকরণের জন্য একটি আইপ্যাড [ইউআইএস স্ক্রিন মেইনস্ক্রিন] ounds

নিম্নলিখিত প্রকাশিত সমস্ত সংস্করণে সঠিক উচ্চতা এবং প্রস্থটি প্রদান করে।

-(CGRect)currentScreenBoundsDependOnOrientation
{
    NSString *reqSysVer = @"8.0";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
        return [UIScreen mainScreen].bounds;

    CGRect screenBounds = [UIScreen mainScreen].bounds ;
    CGFloat width = CGRectGetWidth(screenBounds)  ;
    CGFloat height = CGRectGetHeight(screenBounds) ;
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;

    if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
        screenBounds.size = CGSizeMake(width, height);
        NSLog(@"Portrait Height: %f", screenBounds.size.height);
    }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        screenBounds.size = CGSizeMake(height, width);
        NSLog(@"Landscape Height: %f", screenBounds.size.height);
    }

    return screenBounds ;
}

8

আপনি যদি ওরিয়েন্টেশন নির্ভর আকার চান এবং আপনার একটি ভিউ রয়েছে, আপনি কেবল ব্যবহার করতে পারেন:

view.bounds.size

মহান! KISS সলিউশন =
এটিকে

4
KISS এর অর্থ "এটিকে সহজ এবং বোকা রাখুন" - LOL! এর অর্থ "এটি সরল রাখুন, বোকা!" :-)
এরিক ভ্যান ডের নিউট

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

5

আমি বিভাগ লিখলাম UIScreen , সব iOS সংস্করণ উপর কাজ করে, আপনি এটির মতো এটি ব্যবহার করতে পারেন, যাতে:
[[UIScreen mainScreen] currentScreenSize]

@implementation UIScreen (ScreenSize)

- (CGSize)currentScreenSize {
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    CGSize screenSize = screenBounds.size;

    if ( NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1 ) {  
        UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        if ( UIInterfaceOrientationIsLandscape(interfaceOrientation) ) {
            screenSize = CGSizeMake(screenSize.height, screenSize.width);
        }
    }

    return screenSize;
}

@end

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

5

ওরিয়েন্টেশন নির্ভর পর্দার আকারগুলি পেতে এখানে একটি দ্রুত উপায়:

var screenWidth: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
var screenHeight: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
var screenOrientation: UIInterfaceOrientation {
    return UIApplication.sharedApplication().statusBarOrientation
}

এগুলি আমার একটি প্রকল্পের একটি স্ট্যান্ডার্ড ফাংশন হিসাবে অন্তর্ভুক্ত করা হয়েছে:

https://github.com/goktugyil/EZSwiftExtensions


0
float msWidth = [[UIScreen mainScreen] bounds].size.width*(IS_RETINA?2.0f:1.0f);
float msHeight = [[UIScreen mainScreen] bounds].size.height*(IS_RETINA?2.0f:1.0f);
if ( UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ) {
    os->setWidth(MIN(msWidth, msHeight));
    os->setHeight(MAX(msWidth, msHeight));
} else {
    os->setWidth(MAX(msWidth, msHeight));
    os->setHeight(MIN(msWidth, msHeight));
}

NSLog(@"screen_w %f", os->getWidth());
NSLog(@"screen_h %f", os->getHeight());

0

তবে, আইওএস 8.0.2 এ:

+ (NSUInteger)currentWindowWidth
{
    NSInteger width = 0;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    CGSize size = [UIScreen mainScreen].bounds.size;
   // if (UIInterfaceOrientationIsLandscape(orientation)) {
   //     width = size.height;
   // } else {
        width = size.width;
  //  }

    return width;
}

0

আপনি যে আকারটি পুনরায় আকার দিতে চান তার জন্য -> setNeedsDisplay () ব্যবহার করুন।

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