如何绘制NSImage以适合我的NSView?

时间:2016-05-20 13:59:32

标签: objective-c nsview

我正在开发一个仅显示图片的今日小部件扩展程序。单击图片将加载下一个,依此类推。 有些图像很宽,而且身体很苗条。我希望它们被调整大小,保持宽高比以填充通知中心的宽度,即320。 图像本身包含在NSImageView中,NSImageView在Todays小部件的NSView中绘制。 我总是希望视图尽可能紧凑,但图像应该仍然使用它的全宽。 我已经在这一周工作了一段时间,我似乎无法正常工作。

- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"Init!");
        _imageView = [[NSImageView alloc] init];
        _model = [[ImageViewModel alloc] init];
    }
    return self;
}

- (void)viewDidLoad {
    NSLog(@"View did load!");
    [super viewDidLoad];
    _image = [_model getImage];
    [_imageView setImage:_image];
    [self alignView];
    [self.view addSubview:_imageView];
}

- (void)alignView {
    float oldWidth = _image.size.width;
    float scaleFactor = 320 / oldWidth;

    float newHeight = _image.size.height * scaleFactor;
    float newWidth = oldWidth * scaleFactor;


    NSRect newRect = NSMakeRect(0, 320-newHeight, newWidth, newHeight);
    [_imageView setFrame:newRect];
    self.preferredContentSize = NSMakeSize(self.preferredContentSize.width, 

    newHeight);
}

这是调整图像大小的代码。有些图片正确缩放,有些图片在中间向下切割。我只是想让图片使用通知中心的全宽,但仍保持正确的宽高比。然后,通知中心应通过垂直裁剪此特定小部件使用的空间来响应缩放的图像大小,这样就不会浪费空间。 我的代码完全表现得很奇怪。看起来图像是从顶部绘制的,有时它们是在中间切割但没有下一个小部件对齐到图像的下边框。剩下很多空间。 看起来小部件的视图具有正确的高度,但图像没有完全绘制。 有些图片甚至没有完全使用宽度,很多图片都没有从TopLeft点开始。我想我的代码非常糟糕。

我真的需要一些帮助。

Notification Center |  Actual Image | What it should be | If Image is smaller
    ----------         ----------        ----------        ----------
    Widget1            Widget1           Widget1           Widget1
    ----------         ----------        ----------        ----------
    Widget2            Widget2           Widget2           Widget2

    ----------         ----------        ----------        ----------
    ImageWidget        ----------        Image.....        Image.....
                       Image.....        ..........        ..........
                       ..........        ..........        ..........
                       ----------        ..........        ----------
                       Free space        ..........        next Widget
                       Free space        ..........
   ----------          ----------        ----------
   next Widget         next Widget       next Widget

我希望它清楚我的意思。

0 个答案:

没有答案