2010-02-12 33 views
10

Tôi gặp sự cố lạ khi định vị cửa sổ trên màn hình. Tôi muốn căn giữa cửa sổ trên màn hình, nhưng tôi không biết làm thế nào để làm điều đó. Đây là những gì tôi đã có. Cửa sổ được tạo bởi nib bởi bộ điều khiển chính:Bất thường về vị trí cửa sổ ca cao

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"]; 
[[ftf window] makeKeyAndOrderFront:self]; 

Bây giờ phương thức IdentFormController đã đánh thức cửa sổ. Để đơn giản tôi đã cố gắng làm setFrameOrigin (NSMakePoint (0, 0)). Điều gì xảy ra như sau:

Lần đầu tiên tôi tạo cửa sổ này, mọi thứ hoạt động như mong đợi. Nhưng nếu tôi tạo ra nó một lần nữa sau khi phát hành trước đó, nó bắt đầu xuất hiện ở vị trí ngẫu nhiên. Tại sao nó làm điều đó?

+5

* ftf * là tên khủng khiếp cho một biến và có thể trở thành vấn đề bảo trì sau này. –

Trả lời

1

Trước hết, có vẻ như bạn cần kiểm tra "dealloc on close" hoặc "release on close" trong thanh tra tài sản của NSWindow. Sau đó, cửa sổ sẽ tự động dọn sạch và bạn có thể xóa cuộc gọi (nguy hiểm) thành [self release] trong mã của riêng bạn.

awakeFromNib được gọi sau khi tất cả các đối tượng từ ngòi đã được hủy lưu trữ và các cửa hàng đã được kết nối, nhưng có thể còn quá sớm để đặt tọa độ cửa sổ. Tôi tin rằng Cocoa thực hiện một số công việc để tự động định vị các cửa sổ tiếp theo bên dưới và bên phải của các cửa sổ hiện có, để các cửa sổ mới không che khuất những cửa sổ cũ. Nó có khả năng làm điều này SAU KHI bạn đặt vị trí trong awakeFromNib, dẫm lên những thay đổi của bạn.

Nơi tốt nhất để đặt vị trí cửa sổ của bạn có thể là một trong các phương thức ủy quyền của NSWindow (windowWillBecomeVisible: có lẽ), hoặc có thể ngay trước khi bạn gọi makeKeyAndOrderFront:.

+0

Đối với một số lý do nó không hoạt động khi phát hành gần đúng được kiểm tra. Cửa sổ có thể đã được deallocating và làm sạch, nhưng làm thế nào về bộ điều khiển? Có lẽ nó đã không được deallocated. Ngay sau khi tôi đã thêm [tự phát hành] - điều cuối cùng đã làm việc.Có lẽ nó nguy hiểm, nhưng ít nhất nó hoạt động và khi bạn thả một bộ điều khiển - thì nó cũng dọn dẹp cửa sổ. – Marius

+0

Tôi nghĩ rằng tôi đã hiểu sai '[self release]' khi áp dụng cho thể hiện NSWindow, không phải là bộ điều khiển. Có thể để làm cho mọi thứ rõ ràng hơn, đại biểu ứng dụng của bạn nên duy trì một con trỏ tới IdentFormController hiện tại. Hoặc nếu bạn phải giải phóng bản thân, hãy sử dụng 'autorelease' để đối tượng không được giải phóng cho đến khi kết thúc vòng lặp chạy. Bất kể: đã chuyển mã sang phương thức ủy nhiệm có giúp gì không? – benzado

+0

Vâng, tôi đã không có cơ hội để kiểm tra nó được nêu ra, nhưng tôi chắc chắn nó sẽ làm việc. Nếu nó hoạt động với [tự phóng thích] - thì tại sao nó không hoạt động từ bên ngoài. Nhân tiện: tại sao [tự phóng thích] mạo hiểm? Nếu tôi chắc chắn tôi sẽ không cần bộ điều khiển này và không có gì sẽ cố gắng và truy cập nó - những vấn đề có thể xảy ra với [tự phát hành]? – Marius

0

Kiểm tra xem bạn có thể đặt trung tâm của cửa sổ với chính giữa màn hình hay không. Và đặt vị trí cửa sổ trên đó. Nó có thể hoạt động.

14

Vì vậy, khi tôi hiểu bạn muốn căn giữa cửa sổ trên màn hình?

Vâng giả NSWindow *window là đối tượng cửa sổ của bạn sau đó có hai phương pháp ...

[window center]; 

Đây là cách tốt nhất để làm điều đó nhưng nó sẽ OFSET để đưa vào trọng lượng thị giác tài khoản và sự hiện diện của Dock.

Nếu bạn muốn trung tâm chết thì đây sẽ làm việc ...

// Calculate the actual center 
CGFloat x = (window.screen.frame.size.width - window.frame.size.width)/2; 
CGFloat y = (window.screen.frame.size.height - window.frame.size.height)/2; 

// Create a rect to send to the window 
NSRect newFrame = NSMakeRect(x, y, window.frame.size.width, window.frame.size.height); 

// Send message to the window to resize/relocate 
[window setFrame:newFrame display:YES animate:NO]; 

Mã này là chưa được kiểm tra nhưng nó mang lại cho bạn một ý tưởng hợp lý của những gì bạn cần phải làm để có được điều này làm việc theo cách bạn muốn, Cá nhân tôi khuyên bạn nên gắn bó với mã của Apple vì nó đã được thử nghiệm và là những gì người dùng mong đợi, cũng từ quan điểm thiết kế với tư cách là một nhà thiết kế, tôi không phải lúc nào cũng dựa vào trung tâm thực tế. Là.

5

Có thể bạn đang chạy ở chế độ định vị cửa sổ tự động. Bạn đã thử gọi

[myWindowController setShouldCascadeWindows: NO]; 

?

Các vấn đề liên quan