Custom View and Scroll View

กุมภาพันธ์ 18, 2008 at 6:54 pm ใส่ความเห็น

พูดถึงเรื่องของ Image Browser มานานแล้ว วันนี้เปลี่ยนมาพูดเรื่อง Custom View และ Scroll View บ้างดีกว่า

ในการแสดงรูปภาพลงไปบน Custom View นั้น อาจใช้ method ของ NSImage ที่ชื่อว่า

compositeToPoint:fromRect:operation: ซึ่งเป็นการวาดรูปลงไปบน Custom View โดยเริ่มต้นที่จุดที่กำหนด หรืออาจใช้ method
drawInRect:fromRect:operation:fraction: เป็นการวาดรูปลงไปบน Custom View บนพื้นที่ (Rect) ที่กำหนดไว้

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

เนื่องจาก ลักษณะการทำงานของ Scroll View คือ ทำการแสดงผลรูปภาพทั้งหมดโดยคงรายละเอียดของรูปภาพไว้(เช่น ขนาด pixel) ดังเช่นภาพตัวอย่างด้านล่าง

scroll
สีฟ้าด้านหลังคือขนาดรูปทั้งหมด สีเขียวด้านหน้า คือพื้นที่แสดงผลที่มี

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

การแก้ปัญหาก็คือ เซตขนาดของ Frame ที่ใช้แสดงภาพให้มันมีขนาดเพียงพอซะก่อนจะวาดภาพลงไปก็แก้ไขได้แล้ว method ในการเซตขนาดของเฟรมก็คือ setFrame:<#(NSRect)frameRect#> ซึ่งเป็นคำสั่งของ Class NSView

เราก็แค่นำขนาดของรูปภาพที่ได้จากการใช้ method [image size]; (image หมายถึงรูปภาพของเรา) มาใส่ลงไปเพื่อกำหนดขนาดของ frame เท่านี้ก็ดูน่าจะเรียบร้อย

…แต่ จากการที่ผมทำแล้ว พบว่า ไม่เสมอไปที่ method [image size] จะให้ขนาดของรูปภาพที่ถูกต้องมา มีผลให้ภาพแสดงผลถูกบ้างผิดบ้าง วิธีแก้ไขก็คือ การหาขนาดภาพจริงมาสร้างเป็น frameRect ที่ถูกต้องจริงๆ ตามโค้ดดังนี้

NSRect imageRect;
imageRect.size.width = [[[image representations] objectAtIndex:0] pixelsWide];
imageRect.size.height = [[[image representations] objectAtIndex:0] pixelsHigh];
imageRect.origin = NSZeroPoint;

คราวนี้เราก็จะได้ frameRect ที่มีขนาดเท่ารูปภาพจริงซะที โค้ดการเซตก็จะได้แบบนี้

[self setFrame:imageRect];

นอกเหนือจากปัญหาที่ method [image size] ไม่ return ค่าขนาดที่แท้จริงของรูปภาพมาให้แล้ว รูปภาพที่แสดงขนาดก็อาจไม่ถูกเหมือนกันครับ แต่เราก็แก้ปัญหาได้ด้วยวิธีการเดิม ก็คือ เซตขนาดของรูปภาพซะก่อน ด้วยคำสั่ง

[image setSize:imageRect.size];

จากนั้น ก็แสดงรูปภาพใน CustomView ตามปรกติจาก method ที่กล่าวไว้ข้างต้น เท่านี้ก็เรียบร้อยแล้วครับ

 

scroll2

Entry filed under: Cocoa Programming. Tags: .

Worst Valentine เจริญครับ…บ้านเมืองกู

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google photo

You are commenting using your Google account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


del.icio.us For iPhone dev

Post Calendar

กุมภาพันธ์ 2008
พฤ อา
« ม.ค.   มี.ค. »
 123
45678910
11121314151617
18192021222324
2526272829  

%d bloggers like this: