2014-02-27 15 views
8

Ich weiß, dass Sie Ipad oder Iphone mit einer if-Anweisung mit UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad wählen können. Aber ich habe mich gefragt, ob Sie das gleiche für iPhone 3,5 Zoll Bildschirm auf iPhone 4 Zoll Bildschirm tun könnten. Ich habe ein Spiel, das ursprünglich für den iPhone 4-Zoll-Bildschirm entwickelt wurde, aber automatisches Layout verwendet wurde, um die Fehler zwischen den beiden Geräten zu beheben, die eine Sache, die ich ändern muß, ist, dass, wenniPhone 3,5-Zoll-Bildschirm - 4-Zoll-Bildschirm:

if (ball.center.y > 600) { 
    RandomPosition = arc4random() %248; 
    RandomPosition = RandomPosition + 36; 
    ball.center = CGPointMake(RandomPosition, -22); 
} 

Denn es ist ursprünglich auf dem 4-Zoll-Bildschirm entwickelt, ist das Spiel eingerichtet, um den Ball an den oberen Rand des Bildschirms zurückgesetzt, wenn es> 600 Pixel ist, die knapp unter dem iPhone 4-Zoll-Bildschirm ist. Es funktioniert immer noch richtig, es gibt nur eine kleine Verzögerung zwischen der Unterseite des 3,5-Zoll-Bildschirms und dem Zurücksetzen der Position. Gibt es da überhaupt noch eine if-Anweisung mit UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom(iphone4???) um eine neue ball.center.y> 300 oder so einzurichten?

+1

vielleicht [diese] (http://stackoverflow.com/questions/19852873/how-can-i-write-the-code-for-iphone-3-5 -inches-Bildschirm-und-4-Zoll-Bildschirm) Link Hilfe Sie –

+1

Check this: http://stackoverflow.com/questions/20489964/developing-same-ui-for-3-5-inch-4-0- Zoll-Bildschirme-in-xcode-5-0-1-keine-Landschaft/20490195 # 20490195 –

Antwort

17

Sie versuchen, Code können sich. Fügen Sie diesen Code in Constant.h

#define IS_IPAD ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? YES : NO) 
#define IS_IPHONE_5 (([UIScreen mainScreen].scale == 2.f && [UIScreen mainScreen].bounds.size.height == 568)?YES:NO) 
#define IS_RETINA_DISPLAY_DEVICE (([UIScreen mainScreen].scale == 2.f)?YES:NO) 

Nun ist die Gerätegröße fügen Sie den folgenden Code in Ihre Ansichten zu überprüfen

if (IS_IPAD) 
{ 
     //do stuff for iPad 
} 
else 
{ 
    if(IS_IPHONE_5) 
    { 
     //do stuff for 4 inch iPhone screen 
    } 
    else 
    { 
     //do stuff for 3.5 inch iPhone screen 
    } 

} 
+0

kein Grund, die screen.scale auf Ihrem 'IS_WIDESCREEN_IPHONE' zu überprüfen, da es keine Retina-Breitbild-Telefone sind und selbst wenn es war, die Namensgebung wäre aus, als ein Breitbild, nicht-Retina-Telefon würde keine Rückkehr ... –

1

Verwenden Sie diese Methode wissen, Gerätetyp und Modell wie iPhone5/4S/4 oder andere

+ (NSString *)yesButWhichDeviceIsIt 
{ 
    BOOL hasRetina = NO; 
    if ([UIScreen instancesRespondToSelector:@selector(scale)]) 
    { 
     CGFloat scale = [[UIScreen mainScreen] scale]; 
     if (scale > 1.0) 
     { 
      hasRetina = YES; 
     } 
    } 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     if (hasRetina) 
     { 
      return @"iPad retina"; 
     } else { 
      return @"iPad"; 
     } 
    } 
    else { 
     if (hasRetina) 
     { 
      if ([[UIScreen mainScreen] bounds].size.height == 568) 
      { 
       return @"iPhone5"; //4 inch 64 bit 
      } 
      else { 
       return @"iPhone4s"; // 4 inch 
      } 
     } 
     else { 
      return @"iPhone"; //3.5 inch 
     } 
    } 
} 

ich das hoffentlich helfen

+0

Sehr hilfreich. Thanks :) –

+0

@ShenHutah können Sie bitte die Antwort –

+0

meiner Meinung nach ein paar verschiedene Methoden vom Typ (BOOL) akzeptieren wird für diese Frage weit nützlicher als eine Zeichenfolge sein, obwohl eine device Saite auf jeden Fall seine Anwendungen hat .. gibt es weit bessere Antworten hier bezüglich der Frage, wie gefragt – Jef

6

Sie für 3,5 Zoll und 4 Zoll durch Klage gegen unten Anweisung überprüfen

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
{ 
if ([[UIScreen mainScreen] bounds].size.height>480.0f) 
{ 
     NSLog(@"App is running on iPhone with screen 4 inch"); 
} 
else 
{ 
     NSLog(@"App is running on iPhone with screen 3.5 inch"); 
} 
} 
+1

Sehr hilfreich. Thanks :) –

2

Sie unter Methode verwenden können, wenn iphone zu überprüfen iPhone 5 also von 4inch

ist
+0

UIUserInterfaceIdiomPhone ist sowohl für iPod und iPhone –

+0

Yep, sorry vergessen – Jef

5

Basierend auf den anderen Antworten, wenn Sie dies viel überprüfen tun planen, könnte es sinnvoll sein, einen Makro für sie zu schaffen:

#define isLargerPhone() (([UIScreen mainScreen].bounds.size.height > 480) && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 

diese in einem MyMacros.h (oder ähnlich), wo Sie Import in Ihre Prefix.pch Datei, dann, wenn Sie die Prüfung durchführen müssen Sie einfach tun:

if (isLargePhone()){ 
    // do whatever... 
} 
+0

Danke, guten Vorschlag verwendet. –

+0

Gern geschehen. Fühlen Sie sich frei, um meine Antwort zu bewerten, wenn Ihnen danach ist. ;-) –

+0

Rep reicht noch nicht hoch, lol, sorry :( –

0

ok ich bin hier, ist es in einer Kategorie, sorry zu setzen beantworten, aber es erlaubt mir besser Formatierung ...

erste Datei - UIDevice + JEFkit.h

#import <UIKit/UIKit.h> 

@interface UIDevice (JEFkit) 
#pragma mark device type.. 
+(NSString *)deviceType; 
+(BOOL)iPad; 
+(BOOL)iPadMini; 
+(BOOL)fourInchScreen; 
+(BOOL)retinaDisplay; 
+(Float32) pixelsPer10mm; 

#pragma mark orientation.. 
+(UIInterfaceOrientation)orient; 
+(BOOL)landscape; 

#pragma mark specific feature checkers.. 
+(NSString *)deviceName; 
+(BOOL)camera; 

+(NSString *)systemVersion; 
+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement;// eg NSString *reqSysVer = @"4.0" 
+(BOOL)iOs7; 



@end 

und die wichtigsten, einige von ihnen sind nur Wrapper für Dinge, die ich nicht erinnern kann, z. die deviceIdiom Zeug sowieso seine nur eine kleine ‚Helfer‘ Klassenerweiterung .. UIDevice + JEFkit.m

#import "UIDevice+JEFkit.h" 

#include <sys/types.h> 
#include <sys/sysctl.h> 

@implementation UIDevice (JEFkit) 


#pragma mark device type.. 
+(NSString *)deviceType{ 
    NSString *result = [[UIDevice currentDevice] model]; 
    return result; 
} 
+(BOOL)iPad{ 
    BOOL result = NO; 
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    result = YES; 
    } else { 
    result = NO; 
    } 
#endif 
    return result; 


} 
+(BOOL)iPadMini{ 

    if (![UIDevice iPad]) { 
    return NO; 
    } 


    size_t size1; 
    sysctlbyname("hw.machine", NULL, &size1, NULL, 0); 
    char *machine1 = malloc(size1 + 1); 
    sysctlbyname("hw.machine", machine1, &size1, NULL, 0); 
    machine1[size1] = 0; 

    if (strcmp(machine1, "iPad1,1") == 0 || strcmp(machine1, "iPad2,1") == 0 || strcmp(machine1, "iPad2,2") == 0 || strcmp(machine1, "iPad2,3") == 0 || strcmp(machine1, "iPad2,4") == 0) { 
    /* iPad 1 or 2 */ 
    // JLog(@"iPad 1 or 2"); 
    free(machine1); 
    return NO; 
    } 

    if ([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) { 
    if ([[UIScreen mainScreen] scale] < 2.0) { 
     free(machine1); 
     return YES; //all other non retina devices are eliminated 
    } 
    }else{ 
    ///does not respond to @selector(scale) 
    /// should not ever happen 
    free(machine1); 
    return NO; 
    } 

    //ok only retina ipads are left... 
    if (strcmp(machine1, "iPad4,4") == 0 || strcmp(machine1, "iPad4,5") == 0) { 
    /* 2nd gen minis w retina*/ 
    free(machine1); 
    return YES; 
    } 

    free(machine1); 


    return NO; 

} 
+(BOOL)fourInchScreen{ 

    if (![UIDevice iPad] && ([UIScreen mainScreen].bounds.size.height == 568 || [UIScreen mainScreen].bounds.size.width == 568)) return YES; 
    else return NO; 
} 
+(BOOL)retinaDisplay{ 

    BOOL result = NO; 

    if ([[UIScreen mainScreen]respondsToSelector:@selector(scale)]){ 

    if ([[UIScreen mainScreen] scale] == 2.0) result = YES; 

    } 
    return result; 
} 

+(Float32) pixelsPer10mm{ 
    CGFloat dpi; 
    if ([UIDevice iPadMini]) { 
    dpi = (Float32)163.0; 
    } else if ([UIDevice iPad]) { 
    dpi = (Float32)132.0; 
    }else {dpi = (Float32)163.0;} 

    // JLog(@"pixels /10 mm %.3f", dpi/2.54); 




    return (Float32)(dpi/(Float32)2.54); 







    //return 64.173; 
} 

#pragma mark orientation.. 
+(UIInterfaceOrientation)orient{ 
    return [[UIApplication sharedApplication] statusBarOrientation]; 
} 
+(BOOL)landscape{ 
    if (UIInterfaceOrientationIsLandscape([UIDevice orient])) { 
    return YES; 
    } 
    return NO; 

} 

#pragma mark specific feature checkers.. 
+(NSString *)deviceName{ 

    return [[UIDevice currentDevice] name]; 
} 
+(BOOL)camera{ 
    BOOL result = [UIImagePickerController isSourceTypeAvailable: 
       UIImagePickerControllerSourceTypeCamera]; 
    return result; 
} 


+(NSString *)systemVersion{ 
    NSString *result = [[UIDevice currentDevice] systemVersion]; 
    return result; 
} 
+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{ 

    // eg NSString *reqSysVer = @"4.0"; 


    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 

    if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending) 
    { 
    return YES; 
    }else{ 
    return NO; 
    } 





} 


+(BOOL)iOs7{ 

    return (NSClassFromString(@"NSLayoutManager") != nil); 

} 



@end 

so in dieser Kategorie verwende ich es nur hinzufügen zu projizieren (eigentlich seinen Teil meiner ‚jefkit‘ statische Bibliothek , aber wenn ich diese nur hinzufügen war, id meine PCH-Datei gehen und fügen Sie

#import "UIDevice+JEFkit.h" 
+0

Vielen Dank @Jef, bedeutet viel. –

0

ich einen Scheck für die längste Kante, da der Wert der Grenzen Änderungen für Geräteausrichtung hinzugefügt.Ich habe die längste Kante anstelle der Geräteausrichtung verwendet, da manchmal die Ausrichtung als Unbekannt gemeldet werden kann. Ich habe dies in einer UIDevice Erweiterung:

extension UIDevice { 
    func isLargerPhone() -> Bool { 
     let threePointFiveInchScreenHeight: CGFloat = 480 
     let dimensionToCheck = max(UIScreen.mainScreen().bounds.size.height, UIScreen.mainScreen().bounds.size.width) 
     let isLargerPhone = dimensionToCheck > threePointFiveInchScreenHeight && userInterfaceIdiom == .Phone 

     return isLargerPhone 
    } 

    func isSmallerPhone() -> Bool { 
     return !isLargerPhone() && userInterfaceIdiom == .Phone 
    } 
}