Tôi đã có một NSView (myView) bọc trong một NSScrollView (myScrollView). Sử dụng các nút phóng to/thu nhỏ, người dùng có thể thay đổi tỷ lệ của myView. Nếu người dùng hiện đang được cuộn đến một vị trí cụ thể trong myView, tôi muốn giữ phần đó của chế độ xem trên màn hình sau khi quá trình thu phóng đã diễn ra.Làm thế nào để duy trì vị trí cuộn trong NSScrollView khi thay đổi tỷ lệ?
Tôi đã có mã mà trông như thế này:
// preserve current position in scrollview
NSRect oldVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint oldCenter = NSPointFromCGPoint(CGPointMake(oldVisibleRect.origin.x + (oldVisibleRect.size.width/2.0),
oldVisibleRect.origin.y + (oldVisibleRect.size.height/2.0)));
// adjust my zoom
++displayZoom;
[self scaleUnitSquareToSize:NSSizeFromCGSize(CGSizeMake(0.5, 0.5))];
[self calculateBounds]; // make sure my frame & bounds are at least as big as the visible content view
[self display];
// Adjust scroll view to keep the same position.
NSRect newVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint newOffset = NSPointFromCGPoint(CGPointMake((oldCenter.x * 0.5) - (newVisibleRect.size.width/2.0),
(oldCenter.y * 0.5) - (newVisibleRect.size.height/2.0)));
if (newOffset.x < 0)
newOffset.x = 0;
if (newOffset.y < 0)
newOffset.y = 0;
[[myScrollView contentView] scrollToPoint: newOffset];
[myScrollView reflectScrolledClipView: [myScrollView contentView]];
Và có vẻ như loại gần, nhưng nó không hoàn toàn đúng và tôi không thể tìm ra những gì tôi đang làm sai. hai câu hỏi của tôi là:
1) Có không một built-in cái gì đó dọc theo dòng:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2) Nếu không, ai cũng có thể thấy những gì tôi đang làm sai trong "chặng đường dài của tôi xung quanh "cách tiếp cận, ở trên?
Cảm ơn!
Hiệu ứng tôi muốn là: giả sử tôi đang nhìn vào giữa màn hình. Khi tôi phóng to (hoặc -out), hãy giữ điều đó ở giữa màn hình. Cảm ơn! – Olie
Câu trả lời tuyệt vời! Thay vì đặt floatValue trên các thanh cuộn sau khi tôi đã cuộn chế độ xem của tôi về nguồn gốc được tính toán, tôi gọi là reflectScrolledClipView: trên chế độ xem cuộn của tôi. Điều này dường như có được các thanh cuộn ở đúng vị trí. Không chắc chắn nếu điều này là chính xác vì đây là ứng dụng Mac đầu tiên tôi đã tạo ra, nhưng nó làm việc cho tôi. – afarnham