วิธีการพัฒนาหรือโยกย้ายแอพสำหรับความละเอียดหน้าจอ iPhone 5


495

จอแสดงผล iPhone 5 ใหม่มีอัตราส่วนภาพใหม่และความละเอียดใหม่ (640 x 1136 พิกเซล)

สิ่งที่จำเป็นในการพัฒนาแอพพลิเคชั่นใหม่หรือการเปลี่ยนแปลงที่มีอยู่แล้วให้เป็นขนาดหน้าจอใหม่?

สิ่งที่เราควรคำนึงถึงในการทำให้แอปพลิเคชัน "เป็นสากล" สำหรับทั้งจอแสดงผลรุ่นเก่าและอัตราส่วนไวด์สกรีนใหม่

คำตอบ:


481
  1. ดาวน์โหลดและติดตั้งรุ่นล่าสุดของXcode
  2. ตั้งค่าไฟล์เปิดหน้าจอสำหรับแอปของคุณ (ในแท็บทั่วไปของการตั้งค่าเป้าหมายของคุณ) นี่คือวิธีที่คุณจะใช้ขนาดเต็มของหน้าจอรวมถึงขนาดมุมมองแยกของ iPad ใน iOS 9
  3. ทดสอบแอปของคุณและหวังว่าจะไม่ทำอะไรอย่างอื่นเนื่องจากทุกอย่างจะทำงานได้อย่างน่าอัศจรรย์หากคุณตั้งค่ามาสก์ปรับขนาดอัตโนมัติให้เหมาะสมหรือใช้เค้าโครงอัตโนมัติ
  4. หากคุณไม่มีให้ปรับเลย์เอาต์มุมมองของคุณโดยเฉพาะกับเลย์เอาต์อัตโนมัติ
  5. หากมีบางสิ่งที่คุณต้องทำสำหรับหน้าจอขนาดใหญ่โดยเฉพาะดูเหมือนว่าคุณต้องตรวจสอบความสูง[[UIScreen mainScreen] bounds]เนื่องจากดูเหมือนจะไม่มี API เฉพาะสำหรับสิ่งนั้น ตั้งแต่ iOS 8 ยังมีคลาสขนาดต่าง ๆ ที่มีขนาดหน้าจอเป็นนามธรรมหรือขนาดกะทัดรัดตามแนวตั้งและแนวนอนและแนะนำให้ปรับ UI ของคุณ

1
บางทีมันอาจเป็นสิ่งที่น่าจดจำ ใหม่ความละเอียดและอัตราส่วนกว้างยาว? ใหม่ autorotation หรือไม่ noooo! ที่จริงแล้วการควบคุม autorotation มากขึ้นอาจดี
Fistman Rhythmic

89
เป็นที่น่าสังเกตว่า [UIImage imageNamed: @ "background.png"] จะยังโหลดเฉพาะ "background.png" หรือ "background@2x.png" ก็จะไม่โหลด "background-568h@2x.png" หากมี .
tvon

1
การเพิ่ม "Default-568h@2x.png" เพียงพอหรือมีตัวเลือกเพิ่มเติมในการตั้งค่าการสร้างที่เราสามารถ / ควรปรับหรือไม่
Lukasz

3
@ Lukasz ก็พอ (และวิธีเดียว) เพื่อรองรับความสูง 1,336 พิกเซล แอพของคุณจะยืดได้อย่างถูกต้องขึ้นอยู่กับวิธีการตั้งค่ามุมมองของคุณ แต่ถึงแม้ว่าคุณจะกำหนดค่าฮาร์ดโค้ดทุกอย่างมันก็ไม่น่าจะเป็นเรื่องใหญ่สำหรับการตั้งค่ามาสก์ที่ปรับขนาดอัตโนมัติหรือ Autolayout
ฟิลิป Radelic

1
@FilipRadelic - ความละเอียดที่คุณระบุคือ 1136 * 960 มันคือ 1136 * 640 .. ?? ..
NiKKi

117

หากคุณมีแอพที่สร้างขึ้นสำหรับ iPhone 4S หรือรุ่นก่อนหน้าแอปจะทำงานกับตู้จดหมายใน iPhone 5

ในการปรับแอปของคุณให้เป็นหน้าจอที่สูงขึ้นใหม่สิ่งแรกที่คุณทำคือเปลี่ยนภาพเริ่มต้นเป็น: Default-568h@2x.png ขนาดของมันควรเป็น 1136x640 (HxW) ใช่การมีรูปภาพเริ่มต้นในขนาดหน้าจอใหม่เป็นกุญแจสำคัญที่ทำให้แอปของคุณใช้หน้าจอ iPhone 5 ใหม่ทั้งหมด

(โปรดทราบว่ารูปแบบการตั้งชื่อใช้งานได้เฉพาะกับภาพเริ่มต้นเท่านั้นการตั้งชื่อรูปภาพอื่น "Image-568h@2x.png" จะไม่ทำให้โหลดขึ้นมาแทนที่ "Image@2x.png" หากคุณต้องการโหลดภาพอื่น สำหรับขนาดหน้าจอที่แตกต่างกันคุณจะต้องทำโดยทางโปรแกรม)

หากคุณโชคดีมากนั่นอาจเป็น ... แต่ในทุกโอกาสคุณจะต้องดำเนินการอีกไม่กี่ขั้นตอน

  • ตรวจสอบให้แน่ใจว่า Xibs / Views ของคุณใช้การจัดวางอัตโนมัติเพื่อปรับขนาดตัวเอง
  • ใช้สปริงและเสาเพื่อปรับขนาดมุมมอง
  • หากนี่ยังไม่ดีพอสำหรับแอปของคุณให้ออกแบบ xib / storyboard ของคุณสำหรับขนาดหน้าจอหนึ่งและกำหนดตำแหน่งใหม่โดยทางโปรแกรม

ในกรณีที่รุนแรง (เมื่อไม่มีสิ่งใดเพียงพอ) ให้ออกแบบ Xibs สองอันและโหลดอันที่เหมาะสมในตัวควบคุมมุมมอง

วิธีตรวจจับขนาดหน้าจอ:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}

สวัสดี sanjay ที่เราต้องค้นหาว่า iPhone 5 หรือเก่ากว่านั้นจะต้องปรับขนาดทุกอย่างตามที่ฉันบอกว่าฉันมี tableview ที่มีความสูง 367 พร้อมแถบนำทางและ tabbar ฉันจะต้องปรับขนาดสำหรับ iphone 5
Raheel Sadiq

2
แล้ว iPod touch ล่ะ? แล้ว iPhone รุ่นต่อไปล่ะ? ควรอ้างอิงขนาดหน้าจอ 3.5 นิ้ว / 4 นิ้วไม่ใช่ iPhone / iPhone5
valexa

2
Gotcha อีกอันที่ต้องระวังคือ viewDidLoad จะถูกเรียกก่อนที่ xib ของคุณจะถูกปรับขนาดดังนั้นหากคุณทำการคำนวณใด ๆ ตามสิ่งต่าง ๆ ในปลายปากกาโปรดทราบว่าตำแหน่งอาจเปลี่ยนไปอย่างไร (หรือการคำนวณดังกล่าวใน viewWillAppear)
Kendall Helmstetter Gelner

30

สิ่งที่ต้องทำจริงๆคือการเพิ่มอิมเมจเปิดตัวชื่อ "Default-568h@2x.png" ลงในแหล่งข้อมูลแอปและในกรณีทั่วไป (หากคุณโชคดีพอ) แอปจะทำงานได้อย่างถูกต้อง

ในกรณีที่แอพไม่รองรับเหตุการณ์สัมผัสให้ตรวจสอบว่าหน้าต่างคีย์มีขนาดที่เหมาะสม วิธีแก้ปัญหาคือการกำหนดเฟรมที่เหมาะสม:

[window setFrame:[[UIScreen mainScreen] bounds]]

มีปัญหาอื่น ๆ ที่ไม่เกี่ยวข้องกับขนาดหน้าจอเมื่อย้ายไปยัง iOS 6 อ่านหมายเหตุประจำรุ่น iOS 6.0เพื่อดูรายละเอียด


22

บางครั้ง (สำหรับแอป pre-storyboard) หากเลย์เอาท์จะแตกต่างกันอย่างเพียงพอมันก็คุ้มค่าที่จะระบุ xib ที่แตกต่างกันตามอุปกรณ์ (ดูคำถามนี้ - คุณจะต้องแก้ไขรหัสเพื่อจัดการกับ iPhone 5) ใน viewController เริ่มต้นเนื่องจากไม่มีการ twiddling ด้วยมาสก์การเปลี่ยนขนาดอัตโนมัติจะทำงานหากคุณต้องการกราฟิกที่แตกต่างกัน

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    NSString *myNibName;
    if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
    else myNibName = @"MyNib";

    if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {


...

สิ่งนี้มีประโยชน์สำหรับแอพที่กำหนดเป้าหมายไปที่ iOS เวอร์ชันเก่า


+1 สิ่งที่เหนื่อยล้าเกี่ยวกับความเข้ากันได้ในอนาคตคืออะไร ปัจจุบันรหัสชิ้นนี้ไม่ปลอดภัยเนื่องจากคำนึงถึงอุปกรณ์ iPhone 5 เท่านั้นการตรวจสอบขนาดหน้าจอจะเป็นทางเลือกที่ปลอดภัยกว่า
Stunner

จริง - นี่อาจเป็นส่วนหนึ่งของยูทิลิตี้ที่คืนค่าประเภทอุปกรณ์ - เป็นเพียงตัวอย่างเพื่อแสดงวิธีการใช้ไส้ปากกาที่แตกต่างกันไม่ใช่เกี่ยวกับการรับอุปกรณ์
SomaMan

20

ที่นี่คุณจะพบกับบทแนะนำที่ดี (สำหรับ MonoTouch แต่คุณสามารถใช้ข้อมูลสำหรับ Non-MonoTouch-projects ได้เช่นกัน):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5 -iOS-6-วันนี้ /

  1. สร้างภาพใหม่สำหรับหน้าจอเริ่มต้น / ของคุณ ( 640 x 1136 พิกเซล ) ด้วยชื่อ " Default-568h@2x.png "

  2. ในiOS Simulatorไปที่เมนู Hardware -> Device และเลือก " iPhone (Retina 4-inch) "

  3. สร้างภาพอื่น ๆ เช่นภาพพื้นหลัง

  4. ตรวจจับ iPhone 5 เพื่อโหลดภาพใหม่ของคุณ:

public static bool IsTall
{
    get {
        return UIDevice.currentDevice.userInterfaceIdiom
                    == UIUserInterfaceIdiomPhone
                && UIScreen.mainScreen.bounds.size.height
                    * UIScreen.mainScreen.scale >= 1136;
    }
}

private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
    //adopt the -568h@2x naming convention
    if(IsTall())
    {
        var imagePath = Path.GetDirectoryName(path.ToString());
        var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
        var imageExt = Path.GetExtension(path.ToString());
        imageFile = imageFile + tallMagic + imageExt;
        return UIImage.FromFile(Path.Combine(imagePath,imageFile));
    }
    else
    {
        return UIImage.FromBundle(path.ToString());
    }
}

13

มันง่ายสำหรับการโอนย้าย iPhone5 และ iPhone4 ผ่าน XIBs .........

UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
    UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];               
}    
else
{
     UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}

12

ผมแก้ปัญหานี้ที่นี่ เพียงเพิ่ม ~ 568h @ 2x ต่อท้ายรูปภาพและ ~ 568h ไปยัง xib's ไม่ต้องการการตรวจสอบรันไทม์หรือการเปลี่ยนแปลงรหัสเพิ่มเติม


เพียงเพิ่มคลาสนี้ในโครงการ คุณไม่จำเป็นต้องเขียนรหัสเพิ่มเติม ตัวอย่างเช่นคุณมีไฟล์ xib หนึ่งไฟล์ที่มีภาพพื้นหลังที่มีความละเอียด 320x480, 640x960, 640x1136 (iPhone 3, iPhone 4, iPhone 5) เพียงแค่ตั้งค่าหน้ากากปรับขนาดอัตโนมัติที่ถูกต้องและชื่อภาพ image.png, image@2x.png, image ~ 568h@2x.png
Shimanski Artem

@ShimanskiArtem แต่ฉันสังเกตเห็นว่ามีบางคอมโพเนนต์ที่ทำงานไปยังตำแหน่งอื่น! คุณมีความคิดใดบ้าง ????
Adel

ตรวจสอบหน้ากากปรับขนาดอัตโนมัติ ฉันไม่เห็นเหตุผลอื่น
Shimanski Artem

10

ฉันได้เพิ่มรูปภาพเริ่มต้นใหม่และ (ในการตรวจสอบคำตอบ SE อื่น ๆ อีกหลาย ... ) ทำให้แน่ใจว่าสตอรี่บอร์ดของฉันมีขนาดตัวเองโดยอัตโนมัติและภาพย่อย แต่เรติน่า 4 นิ้วยังคงอยู่ในกล่องจดหมาย

จากนั้นฉันสังเกตเห็นว่าข้อมูล Plist ของฉันมีรายการโฆษณาสำหรับ " เปิดใช้รูปภาพ " ตั้งค่าเป็น " Default.png " ซึ่งฉันลบออกและกล่องจดหมายอย่างน่าอัศจรรย์ปรากฏขึ้นอีก หวังว่าจะช่วยคนอื่นให้ฉันบ้าเหมือนเดิม


9

ฉันเดาว่ามันจะไม่ทำงานในทุกกรณี แต่ในโครงการเฉพาะของฉันมันทำให้ฉันไม่สามารถทำซ้ำไฟล์ NIB:

ที่ไหนสักแห่งในcommon.hคุณสามารถทำให้การกำหนดเหล่านี้ตามออกของสูงของหน้าจอ:

#define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)

ในตัวควบคุมฐานของคุณ:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IS_IPHONE_5) {
        CGRect r = self.view.frame;
        r.size.height = HEIGHT_IPHONE_5 - 20;
        self.view.frame = r;
    }
    // now the view is stretched properly and not pushed to the bottom
    // it is pushed to the top instead...

    // other code goes here...
}

9

ในconstants.hไฟล์คุณสามารถเพิ่มคำสั่ง define เหล่านี้:

 #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
 #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) 
 #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)

9

หากต้องการตรวจสอบว่าแอปของคุณสามารถรองรับ iPhone 5 Retina ได้หรือไม่ให้ใช้: (อาจมีประสิทธิภาพมากกว่าในการส่งคืนประเภทของหน้าจอ, Retina 4S และอื่น ๆ ) แต่ตามที่เขียนไว้ด้านล่าง ใช่หรือไม่)

ในไฟล์ ".h" ทั่วไปให้เพิ่ม:

BOOL IS_IPHONE5_RETINA(void);

ในไฟล์ ".m" ทั่วไปให้เพิ่ม:

BOOL IS_IPHONE5_RETINA(void) {
    BOOL isiPhone5Retina = NO;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if ([UIScreen mainScreen].scale == 2.0f) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960){
                //NSLog(@"iPhone 4, 4s Retina Resolution");
            }
            if(result.height == 1136){
                //NSLog(@"iPhone 5 Resolution");
                isiPhone5Retina = YES;
            }
        } else {
            //NSLog(@"iPhone Standard Resolution");
        }
    }
    return isiPhone5Retina;
}

8

ก่อนอื่นให้สร้าง xibs สองอันและแนบผู้รับมอบสิทธิ์ทั้งหมดคลาสหลักไปยังxibและจากนั้นคุณสามารถใส่เงื่อนไขนี้ตามที่ระบุไว้ด้านล่างในappdelegate.mไฟล์ของคุณใน

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    if ([[UIScreen mainScreen] bounds].size.height == 568)
        {

        self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
        }

        else
        {
             self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];

        }

คุณสามารถใช้มันที่ไหนก็ได้ในโปรแกรมขึ้นอยู่กับความต้องการของคุณแม้ในViewControllerชั้นเรียนของคุณ สิ่งที่สำคัญที่สุดคือคุณสร้างxibไฟล์แยกกันสองไฟล์iphone 4(320*480) and iphone 5(320*568)


7

ลองวิธีการด้านล่างในคลาสซิงเกิล:

-(NSString *)typeOfDevice
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if(result.height == 480)
            {
                return @"Iphone";
            }
            if(result.height == 568)
            {
                return @"Iphone 5";
            }
        }
        else{
            return @"Ipad";;
        }


        return @"Iphone";
    }

7

คุณสามารถใช้Auto Layoutคุณสมบัติและสร้างการออกแบบโดยใช้ความละเอียดหน้าจอ iPhone 5 และมันจะใช้ได้กับทั้งอุปกรณ์ 4 "และ 3.5" แต่ในกรณีนี้คุณควรมีความรู้เพียงพอเกี่ยวกับการจัดหน้า


สิ่งนี้จะไม่ทำงานกับอุปกรณ์ที่ไม่รองรับ iOS 6
jonypz

7

การตรวจสอบboundsด้วย568จะล้มเหลวในโหมดแนวนอน iPhone 5 เปิดตัวเฉพาะในโหมดแนวตั้ง แต่ถ้าคุณต้องการรองรับการหมุนดังนั้น iPhone 5 "เช็ค" จะต้องจัดการกับสถานการณ์นี้เช่นกัน

นี่คือแมโครที่จัดการสถานะการวางแนว:

#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))

การใช้การโทร 'PreferredMode' นั้นมาจากการโพสต์อีกครั้งที่ฉันอ่านไม่กี่ชั่วโมงที่ผ่านมาดังนั้นฉันจึงไม่ได้เกิดความคิดนี้


6

แสดงภาพนี้เป็นครั้งแรก ในภาพนั้นคุณแสดงคำเตือนสำหรับการสนับสนุน Retina 4 ดังนั้นคลิกที่คำเตือนนี้และคลิกที่เพิ่มเพื่อให้หน้าจอ Retina 4 ของคุณเพิ่มโดยอัตโนมัติในโครงการของคุณ

แสดงภาพที่นี่

และหลังจากที่คุณใช้รหัสนี้:

if([[UIScreen mainScreen] bounds].size.height == 568)
    {
        // For iphone 5
    }
    else
    {
        // For iphone 4 or less
    }

6

ฉันไม่เคยประสบปัญหาดังกล่าวกับอุปกรณ์ใด ๆ เพราะฉันมีหนึ่งรหัสฐานข้อมูลสำหรับทุกคนโดยไม่มีค่าฮาร์ดโค้ด สิ่งที่ฉันทำคือการมีภาพขนาดสูงสุดเป็นทรัพยากรแทนที่จะเป็นหนึ่งสำหรับแต่ละอุปกรณ์ ตัวอย่างเช่นฉันจะมีหนึ่งสำหรับการแสดงผลเรตินาและแสดงว่ามันพอดีกับมุมมองดังนั้นมันจะเป็นมุมมองที่เป็นอยู่ในทุกอุปกรณ์ การตัดสินใจเลือกเฟรมของปุ่มในขณะใช้งาน สำหรับเรื่องนี้ฉันใช้ค่า% ของมุมมองสิทธิบัตรตัวอย่างเช่นถ้าฉันต้องการให้ความกว้างครึ่งหนึ่งของมุมมองพาเรนต์ใช้ 50% ของพาเรนต์และใช้กับความสูงและศูนย์กลาง

ด้วยสิ่งนี้ฉันไม่จำเป็นต้องใช้ xibs ด้วยซ้ำ


5

คุณสามารถใช้การกำหนดนี้เพื่อคำนวณว่าคุณใช้ iPhone 5 โดยขึ้นอยู่กับขนาดหน้าจอหรือไม่:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

จากนั้นใช้ifคำสั่งง่ายๆ:

    if (IS_IPHONE_5) {

    // What ever changes
    }

4

ปีเตอร์คุณควรจะดู Canappi จริงๆมันทำทุกอย่างให้คุณสิ่งที่คุณต้องทำคือระบุเลย์เอาต์เช่น:

button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }

จากที่นั่น Canappi จะสร้างรหัส -c เป้าหมายที่ถูกต้องที่ตรวจพบอุปกรณ์ที่แอพทำงานอยู่และจะใช้:

(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5

Canappi ทำงานเหมือนกับ Interface Builder และ Story Board รวมกันยกเว้นว่าอยู่ในรูปแบบข้อความ หากคุณมีไฟล์ XIB อยู่แล้วคุณสามารถแปลงไฟล์เหล่านั้นได้ดังนั้นคุณไม่จำเป็นต้องสร้าง UI ทั้งหมดใหม่อีกครั้งตั้งแต่ต้น


ขอบคุณมาก meta ฉันจะดูที่นี้ แต่ฉันเป็นโปรแกรมเมอร์ใหม่มากและต้องการเรียนรู้วิธีจัดการกับมันใน Objective-C ที่สะอาด
PeterK

4

คุณสามารถตรวจสอบขนาดหน้าจอด้วยตนเองเพื่อกำหนดอุปกรณ์ที่คุณใช้:

#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)

float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
    // 4"

} else {

    // 3"

}

3

คุณสามารถเพิ่มรหัสนี้:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960) {
                NSLog(@"iPhone 4 Resolution");
            }
            if(result.height == 1136) {
              NSLog(@"iPhone 5 Resolution");
            }
        }
        else{
            NSLog(@"Standard Resolution");
        }
    }

2
อันที่จริงมันผิดเล็กน้อย iPhone ใด ๆ ที่ใช้ iOS 4.0 หรือใหม่กว่าจะตอบสนองต่อscaleตัวเลือกการเปิดUIScreenและคุณจะมีกรณีที่รหัส "ความละเอียดมาตรฐาน" ของคุณไม่ทำงาน
Filip Radelic

3

นี่เป็นรหัสสากลที่แท้จริงคุณสามารถสร้างบอร์ดเนื้อเรื่องได้ 3 แบบ:

ตั้งค่าโหมดสากลของโครงการและตั้งค่า iPhone เรื่องราวหลักของคุณด้วยสตอรี่บอร์ด iPhone5 และ ipad หลักพร้อมสตอรีบอร์ดเป้าหมาย iPad ตอนนี้เพิ่มเป้าหมายสตอรี่บอร์ดใหม่สำหรับ iPhone และแก้ไขความละเอียดสำหรับ iphone 4s หรือน้อยกว่าในขณะนี้ใช้AppDelegate.m

iPhone4 / 4s (เหมือนกันสำหรับ 3 / 3Gs) หนึ่งสำหรับiPhone5และทำให้โครงการเป็นสากลด้วยเป้าหมาย Storyboard ใหม่สำหรับ iPad ตอนนี้ในAppDelegate.mภายใต้didFinishLaunchingเพิ่มรหัสนี้:

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;

        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width *scale, result.height *scale);

//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------

        if(result.height == 960){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }

//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------

        if(result.height == 480){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }

        return YES;
 }

ดังนั้นคุณจึงได้สร้างแอพ Universal สำหรับ iPhone 3 / 3Gs / 4 / 4s / 5 iPod ทุกประเภทและ iPad ทุกประเภท

อย่าลืมรวม IMG ทั้งหมดด้วยmyImage.pngและmyImage@2x.png


2

ตามที่ฉันวิธีที่ดีที่สุดในการจัดการกับปัญหาดังกล่าวและหลีกเลี่ยงสองเงื่อนไขที่จำเป็นสำหรับการตรวจสอบความสูงของอุปกรณ์คือการใช้เฟรมญาติสำหรับมุมมองหรือองค์ประกอบ UI ใด ๆ ที่คุณเพิ่มให้คุณดูตัวอย่างเช่นถ้าคุณกำลังเพิ่ม องค์ประกอบ UI บางอย่างที่คุณต้องการที่ด้านล่างของมุมมองหรือเหนือแถบแท็บจากนั้นคุณควรใช้ต้นกำเนิด y ตามความสูงของมุมมองของคุณหรือสำหรับแถบแท็บ (ถ้ามี) และเรามีคุณสมบัติปรับขนาดอัตโนมัติเช่นกัน ฉันหวังว่าสิ่งนี้จะได้ผลสำหรับคุณ


1

แทนที่จะใช้ชุดเงื่อนไขคุณสามารถปรับขนาดมุมมองของคุณโดยอัตโนมัติโดยใช้ขนาดหน้าจอ

int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));

ในกรณีของฉันฉันต้องการมุมมองที่เติมช่องว่างระหว่างฟิลด์อินพุตบางฟิลด์ที่ด้านบนและปุ่มบางปุ่มที่ด้านล่างดังนั้นมุมบนซ้ายคงที่และล่างขวาตัวแปรตามขนาดหน้าจอ แอพของฉันเติมมุมมองภาพด้วยภาพถ่ายที่ถ่ายโดยกล้องดังนั้นฉันต้องการพื้นที่ทั้งหมดที่ฉันสามารถหาได้


1

หากคุณต้องการแปลงแอพที่มีอยู่แล้วให้เป็นสากลคุณต้องเลือกไฟล์ xib ที่เกี่ยวข้อง -> แสดงโปรแกรมอรรถประโยชน์ -> ตัวตรวจสอบขนาดการแสดง

ในตัวตรวจสอบขนาดคุณสามารถดูการปรับขนาดอัตโนมัติโดยใช้เครื่องมือนี้คุณสามารถแปลงเป็นแอพ iOS ที่มีอยู่


0

ใช้ xCode 5 เลือก "โยกย้ายไปยังแคตตาล็อกสินทรัพย์" ในโครงการ> ทั่วไป

จากนั้นใช้ "แสดงในตัวค้นหา" เพื่อค้นหาภาพเริ่มต้นของคุณคุณสามารถจำลองแบบจำลองเป็น 640x1136 จากนั้นลากไปยังแคตตาล็อกสินทรัพย์ตามที่แสดงในภาพด้านล่าง

ตรวจสอบให้แน่ใจว่าทั้งส่วน iOS7 และ iOS6 R4 มีรูปที่ 640x1136 ครั้งต่อไปที่คุณเปิดแอพแถบสีดำจะหายไปและแอพของคุณจะใช้หน้าจอ 4 นิ้ว

ป้อนคำอธิบายรูปภาพที่นี่


0

แจ้งให้ทราบถึงจุดคุ้มค่า - ใน Xcode ใหม่คุณต้องเพิ่มไฟล์รูปภาพนี้ Default-568h@2x.png ไปยังเนื้อหา


0

ใช้ Auto Layoutคุณสมบัติสำหรับมุมมอง มันจะปรับโดยอัตโนมัติตามความละเอียดทั้งหมด

สร้าง xibs สองรายการสำหรับตัวควบคุมที่มีชื่อตัวควบคุมด้วยส่วนต่อท้าย ~ ~ iphone หรือ ~ ipad ณ เวลารวบรวม Xcode จะใช้ xib ที่ถูกต้องตามอุปกรณ์

ใช้คลาสขนาดถ้าคุณต้องการสร้าง xib เดียวสำหรับทั้ง iPhone และ iPad ถ้ามุมมองนั้นง่ายพอที่จะเชื่อมต่อกับ iPhone และ iPad


0

มีปัญหาเล็กน้อยเมื่อทดสอบบนอุปกรณ์ iOS และ iOS Simulator ปรากฏว่าเครื่องจำลอง (XCode 6.0.1) ให้ค่าสวิตช์สำหรับความกว้างและความสูง[[UIScreen mainScreen] bounds].sizeขึ้นอยู่กับทิศทางของอุปกรณ์

ดังนั้นนี่อาจเป็นปัญหาเมื่อพิจารณาขนาดหน้าจอทางกายภาพที่ถูกต้อง รหัสนี้ช่วยแยกความแตกต่างในปี 2014 ทั้งหมดรุ่น iPhone รุ่น:

  • iPhone4s
  • iPhone5 (และ iPhone5s)
  • iPhone6 ​​(และ iPhone6 ​​+)

นอกจากนี้ยังสามารถเปลี่ยนได้อย่างง่ายดายเพื่อสร้างความแตกต่างระหว่างเช่น iPhone6 ​​จาก iPhone6 ​​+

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
    {
        if (iOSDeviceScreenSize.width > 568 || // for iOS devices
            iOSDeviceScreenSize.height > 568) // for iOS simulator
        {   // iPhone 6 and iPhone 6+

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];

            NSLog(@"loaded iPhone6 Storyboard");
        }
        else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
                 iOSDeviceScreenSize.height == 568) // for iOS simulator
        {   // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];

            NSLog(@"loaded iPhone5 Storyboard");
        }
        else
        {   // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)

                // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
            storyboard = [UIStoryboard story    boardWithName:@"MainStoryboard_iPhone" bundle:nil];

                NSLog(@"loaded iPhone4 Storyboard");
        }
    }
    else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {   // The iOS device = iPad

        storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];

        NSLog(@"loaded iPad Storyboard");
    }

    // rest my code
}

0

ฉันขอแนะนำให้ใช้ Autoresizing Mask ในแอปพลิเคชันของคุณตามอินเทอร์เฟซ UI ของคุณมันช่วยประหยัดปัญหาได้มากและดีกว่าการสร้าง UI ที่แตกต่างกันสำหรับหน้าจอ iPhone 4 และ 5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.