这让我很疯狂.我有一个大图像,需要有一个可缩放和可滚动的视图(理想情况下它也应该能够旋转,但我放弃了那部分).由于图像非常大,我打算使用CATiledLayer,但我根本无法让它工作.我的要求是:
我需要能够缩放(在鼠标中心)和平移
图像不应更改其宽度:高度比(不应调整大小,仅缩放).
这应该在Mac OS 10.9上运行(不是 iOS!)
内存使用不应该是巨大的(虽然高达100 MB应该没问题).
我有必要的图像在一个文件中完成,并且还平铺成许多(甚至有不同的缩放级别).我更喜欢使用瓷砖,因为内存应该更容易,但两种选择都可用.
大多数在线示例都是指iOS,因此使用UIScrollView进行缩放/平移,但我无法复制NSScrollView的行为.Mac OS XI发现的唯一例子就是这个,但是他的缩放始终是左下角,而不是中间,当我调整代码使用png文件而不是pdf时,内存使用量大约为400 MB ......
到目前为止,这是我最好的尝试:
@implementation MyView{
CATiledLayer *tiledLayer;
}
-(void)awakeFromNib{
NSLog(@"Es geht los");
tiledLayer = [CATiledLayer layer];
// set up this view & its layer
self.wantsLayer = YES;
self.layer = [CALayer layer];
self.layer.masksToBounds = YES;
self.layer.backgroundColor = CGColorGetConstantColor(kCGColorWhite);
// set up the tiled layer
tiledLayer.delegate = self;
tiledLayer.levelsOfDetail = 4;
tiledLayer.levelsOfDetailBias = 5;
tiledLayer.anchorPoint = CGPointZero;
tiledLayer.bounds = CGRectMake(0.0f, 0.0f, 41*256, 22*256);
tiledLayer.autoresizingMask = kCALayerNotSizable; …Run Code Online (Sandbox Code Playgroud) 我有一个NSScrollView,其documentView是一个巨大的NSView,由许多子NSImageViews组成,他们在地图中充当瓷砖.(整个地图是NSView,因为它比屏幕大小大,所以它嵌入在滚动视图中).
我能够使用正确的平铺位置显示地图,并使用条形/手势滚动.但是..当我启用放大倍率才能进行缩放时,会发生以下情况:
不知怎的,我假设自动布局添加下面的瓷砖边框,我不知道如何禁用它们.这些肯定是边界,因为我已经检查了数千次我的瓷砖和子视图大小相同..所以它来自哪里?我对iOS开发有很多经验,但是我完全迷失了NSScrollView(我的委托方法在哪里?).如何禁用滚动视图的此行为?
这是我的子视图代码:
- (void)setupSubViews
{
NSLog(@"--------Creating subviews!-------");
//first we create the subviews..
//This is the key part, we traverse from top Left, and since OS X coordinates start at bottom left, we need to invert the rows!
for (int i=0; i< NUMBER_OF_COLUMNS; i++) {
for (int j=NUMBER_OF_ROWS-1; j>=0; j--) {
CGRect frame = CGRectMake(i*256, j*256, 256, 256);
NSImageView *newView = [[NSImageView alloc] initWithFrame:frame];
newView.focusRingType = NSFocusRingTypeNone; //I gave this focusRing a try, it didn't work :(
[self addSubview:newView]; …Run Code Online (Sandbox Code Playgroud) 我已经尝试这样做了两个星期,并且发现它不起作用的原因:
弃用的API
不推荐使用以下API:
UIViewController接口方向的方法和属性.如统一故事板中的通用应用程序所述,特征和大小类会替换它们.
我需要的是:a FirstViewController,这是rootViewController我的navigationController.本FristViewController应只在人像模式(不是永远永远永远显示在景观)可用.
然后在导航堆栈中有一些中间ViewControllers(支持两种方向),直到我到达a LastViewController,这应该仅在LandscapeRight模式下可用(并且永远不会在纵向或其他模式下).
我一直在尝试使用以下内容CustomNavigationController,但显然iOS8中的内容发生了变化,我无法让它工作:
- (BOOL)shouldAutorotate { // Available in iOS 6.0 and later
return YES; // // May use topViewController's, but in this app it always returns YES
}
- (NSUInteger)supportedInterfaceOrientations { // Available in iOS 6.0 and later
if (self.topViewController != nil)
return [self.topViewController supportedInterfaceOrientations];
else
return [super supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { // Available …Run Code Online (Sandbox Code Playgroud) objective-c ×3
macos ×2
nsscrollview ×2
appkit ×1
calayer ×1
cocoa ×1
ios8 ×1
iphone ×1
xcode ×1