约束两个文本字段以保持纵横比

时间:2013-03-13 19:27:11

标签: objective-c cocoa nstextfield

我有两个文本字段:一个用于宽度,一个用于高度。

假设起始值为1080 x 720.如果用户将720更改为360,我想自动将1080更改为540.

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

在您的笔尖中添加一个数字格式化程序,并将其配置为将字段限制为整数值,并将控制器指定为两个文本字段的委托。

您还需要在显示视图时填写初始值并更新文本字段。此版本基于NSPopoverDelegate,但您可以对其进行调整。

@property (assign) NSUInteger width;
@property (assign) NSUInteger height;

-(void)awakeFromNib {
    self.numberFormatter.minimumFractionDigits = 0;
    self.numberFormatter.maximumFractionDigits = 0;
}

-(void)popoverWillShow:(NSNotification *)notification {
    self.width = ___;
    self.height = ___;
    self.widthField.stringValue = @"";
    self.heightField.stringValue = @"";
}

-(void)controlTextDidChange:(NSNotification *)obj {
    NSTextField *sender = obj.object;
    NSTextView *textView = [obj.userInfo objectForKey:@"NSFieldEditor"];
    NSString *stringValue = textView.string;
    NSNumber *numberValue = [self.numberFormatter numberFromString:stringValue];
    if (!stringValue.length || !numberValue) {
        self.resizeButton.enabled = NO;
    } else {
        NSInteger integerValue =
        [[self.numberFormatter numberFromString:stringValue] integerValue];
        if (self.widthField == sender) {
            self.heightField.integerValue =
            self.height * integerValue / self.width;
        } else if (self.heightField == sender) {
            self.widthField.integerValue =
            self.width * integerValue / self.height;
        }
        self.resizeButton.enabled = YES;
    }
}

答案 1 :(得分:0)

对于第一个问题,只计算比率(除以另一个):1080是1.5倍720所以如果用户将720更改为360只需要360 * 1.5来获取值(反之亦然540 / 1.5)如果用户改变了1080,则代替720的值。

没有嵌入式选项让NSTextField只采用偶数。