ส่วนประกอบ UI ที่กำหนดเองของ iPhone

ฉันยังใหม่มากในการพัฒนา iPhone

ฉันต้องการสร้างส่วนประกอบ UI ที่สามารถประกอบด้วยสี่เหลี่ยม วงกลม หรือสามเหลี่ยม ฉันจะส่งพารามิเตอร์ไปให้ Constructor เพื่อบอกว่าฉันต้องการรูปร่างแบบไหน

ฉันต้องการให้วัตถุนี้สามารถเคลื่อนที่ได้ด้วยมาตรความเร่งหรือนิ้วของผู้ใช้ ฉันยังต้องการที่จะทำให้มันใหญ่ขึ้นหรือเล็กลง

ฉันคิดว่าจะสร้างองค์ประกอบ UI ที่กำหนดเองซึ่งสืบทอดมาจาก UIView

ฉันไม่รู้ว่าฉันวาดรูปร่างด้วย Quartz 2D หรือไม่ มันจะทำงานเหมือน UI Component

ฉันสามารถทำสิ่งนั้นได้หรือไม่? คุณมีทางออกที่ดีกว่านี้ไหม?


person VansFannel    schedule 03.03.2011    source แหล่งที่มา


คำตอบ (2)


ฉันคิดว่าวิธีแก้ปัญหาที่ง่ายและสม่ำเสมอคือการแบ่งคลาสย่อย UIView เพียงแค่สิ่งที่คุณจะทำ

ตามหลักการแล้ว UIView จะคงเนื้อหาที่เป็นภาพไว้โดยการวาดภาพ (โดยส่วนใหญ่แล้วจะมี Quartz!) หากเนื้อหาภาพมีการเปลี่ยนแปลง? UIView แค่วาดใหม่อีกครั้ง เมื่อคุณเปลี่ยนแปลงสิ่งใด UIView จะวาดทุกอย่างใหม่ (แน่นอนว่านี่เป็นคำอธิบายเชิงแนวคิด ความจริงมีความแตกต่างกันมากเนื่องจากมีการปรับให้เหมาะสมอย่างหนัก)

อย่างไรก็ตาม จุดสำคัญคือสิ่งที่คุณต้องทำเพื่อสิ่งนี้เป็นเพียงการเอาชนะวิธีการเท่านั้น เนื่องจาก UIKit ทำการเพิ่มประสิทธิภาพที่สำคัญที่สุดแทนคุณ

UIView วาดเนื้อหาภาพด้วยวิธี - (void)drawRect:(CGRect)rect และคุณสามารถแทนที่วิธีนี้เพื่อวาดรูปร่างของคุณได้ หากคุณวาดบางอย่างด้วยวิธีนี้ รูปร่างจะถูกวาดบนมุมมองที่โปร่งใส

หากคุณจัดการมุมมอง (ปรับขนาด ย้าย หมุน...) UIKit อาจขอให้มุมมองวาดกราฟิกใหม่ และมุมมองจะเรียกคืนวิธีการวาดรูปร่างของคุณ นี่เป็นเทคนิคปกติมาก กราฟิกและแอนิเมชั่นแบบกำหนดเองส่วนใหญ่ที่สร้างด้วยวิธีนี้ สิ่งที่คุณต้องทำก็แค่เขียนโค้ดรูปวาดในเมธอด - (void)drawRect:(CGRect)rect

มีคำแนะนำที่ดีเกี่ยวกับแนวคิดนี้ในเอกสารอ้างอิง:

และดูแลเกี่ยวกับคุณต้องวาดด้วย CGContextRef ที่ดึงมาโดยการเรียกเมธอด UIGraphicsGetCurrentContext ( void ); แทนที่จะสร้างของคุณเอง บริบทหมายถึงหน้าจออุปกรณ์จริง หากคุณสร้างบริบทของคุณเอง จะไม่มีใครสามารถเสนอหน้าจออุปกรณ์จริงได้

ตัวอย่างเช่น:

@interface MyView : UIView
@end

@implementation MyView
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    // Do your drawing here with the `context`.
    // And don't release it because the it is not yours, just borrowed from `UIKit`.
}
@end

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

person eonil    schedule 03.03.2011
comment
@occulus ว้าว! ฉันซาบซึ้งมาก! ยินดีเสมอที่จะแก้ไขไวยากรณ์ที่ผิดของฉัน :) - person eonil; 03.03.2011
comment
@occulus: แหล่งไวยากรณ์ที่ยอดเยี่ยม! - person VansFannel; 03.03.2011

แน่นอนว่าเป็นไปได้ที่จะวาดมุมมองที่กำหนดเองตามที่ Eonil อธิบาย อย่างไรก็ตาม คุณเคยคิดที่จะใช้ UIImageView เพียงอย่างเดียวหรือไม่

person Jim    schedule 03.03.2011