ก่อนอื่นคุณไม่ควรสร้างมุมมองทั้งหมดใหม่เพื่อให้พอดีกับหน้าจอใหม่หรือใช้มุมมองที่แตกต่างกันสำหรับขนาดหน้าจอที่แตกต่างกัน
ใช้ความสามารถในการปรับขนาดอัตโนมัติของ iOS เพื่อให้มุมมองของคุณสามารถปรับและปรับขนาดหน้าจอใด ๆ
ไม่ยากมากอ่านเอกสารเกี่ยวกับเรื่องนั้น มันจะช่วยคุณประหยัดเวลาได้มาก
iOS 6 ยังมีคุณสมบัติใหม่เกี่ยวกับเรื่องนี้
อย่าลืมอ่านiOS 6 API changelogบนเว็บไซต์ Apple Developer
และตรวจสอบความสามารถของ iOS 6 AutoLayoutใหม่
ที่กล่าวว่าหากคุณต้องการตรวจจับ iPhone 5 จริงๆคุณสามารถพึ่งพาขนาดหน้าจอได้
[ [ UIScreen mainScreen ] bounds ].size.height
หน้าจอของ iPhone 5 มีความสูง 568.
คุณสามารถจินตนาการมาโครเพื่อทำให้ทั้งหมดนี้ง่ายขึ้น:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
การใช้fabs
epsilon อยู่ที่นี่เพื่อป้องกันข้อผิดพลาดที่มีความแม่นยำเมื่อเปรียบเทียบจุดลอยตัวตามที่แสดงในข้อคิดเห็นโดย H2CO3
ดังนั้นจากนี้ไปคุณสามารถใช้มันในมาตรฐาน if / else statement:
if( IS_IPHONE_5 )
{}
else
{}
แก้ไข - ตรวจจับได้ดีขึ้น
ตามที่ระบุไว้โดยบางคนสิ่งนี้จะตรวจจับเฉพาะจอไวด์สกรีนไม่ใช่ iPhone 5 ที่แท้จริง
iPod touch รุ่นต่อไปอาจมีหน้าจอเช่นนี้ดังนั้นเราอาจใช้มาโครชุดอื่น
มาเปลี่ยนชื่อมาโคเดิมIS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
และมาเพิ่มมาโครการตรวจจับแบบจำลอง:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
ด้วยวิธีนี้เราสามารถมั่นใจได้ว่าเรามีรุ่น iPhone และจอกว้างและเราสามารถกำหนดIS_IPHONE_5
มาโครใหม่ได้:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
โปรดทราบว่าตามที่ระบุไว้โดย @ LearnCocos2D มาโครนี้จะไม่ทำงานหากแอปพลิเคชันไม่ได้รับการปรับให้เหมาะกับหน้าจอ iPhone 5 (ไม่มีภาพ Default-568h@2x.png) เนื่องจากขนาดหน้าจอจะยังคงเป็น 320x480 กรณี.
ฉันไม่คิดว่านี่อาจเป็นปัญหาเพราะฉันไม่เห็นสาเหตุที่เราต้องการตรวจจับ iPhone 5 ในแอพที่ไม่ได้รับการปรับปรุงประสิทธิภาพ
สำคัญ - รองรับ iOS 8
บน iOS 8, bounds
ทรัพย์สินของUIScreen
ระดับในขณะนี้สะท้อนให้เห็นถึงการวางแนวอุปกรณ์
เห็นได้ชัดว่ารหัสก่อนหน้านี้จะไม่ทำงานนอกกรอบ
ในการแก้ไขปัญหานี้คุณสามารถใช้nativeBounds
คุณสมบัติใหม่แทนbounds
เนื่องจากมันจะไม่เปลี่ยนแปลงตามการวางแนวและเนื่องจากขึ้นอยู่กับโหมดถ่ายภาพบุคคล
โปรดทราบว่าขนาดของnativeBounds
วัดเป็นพิกเซลดังนั้นสำหรับ iPhone 5 ความสูงจะเท่ากับ1136แทนที่จะเป็น 568
หากคุณกำหนดเป้าหมายเป็น iOS 7 หรือต่ำกว่าโปรดใช้การตรวจจับคุณสมบัติเนื่องจากการโทรnativeBounds
ก่อน iOS 8 จะทำให้แอปของคุณ:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
คุณสามารถปรับมาโครก่อนหน้าได้ด้วยวิธีต่อไปนี้:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
และถ้าคุณต้องการตรวจสอบ iPhone 6 หรือ 6 Plus ให้ใช้ขนาดหน้าจอที่เกี่ยวข้อง