Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何用可视化格式语言设置动态高度_Ios_Objective C_Nslayoutconstraint_Visual Format Language - Fatal编程技术网

Ios 如何用可视化格式语言设置动态高度

Ios 如何用可视化格式语言设置动态高度,ios,objective-c,nslayoutconstraint,visual-format-language,Ios,Objective C,Nslayoutconstraint,Visual Format Language,使用formatVertical,我可以设置视图的高度。但我想使这个值成为动态的,以便能够在所有不同的屏幕上显示相同的外观 有什么我可以做到的吗?我想,你可以使用度量。 目标C解决方案: NSString *format = [NSString stringWithFormat:@"H:|-10-[self]-10-|"]; NSString *formatVertical = [NSString stringWithFormat:@"V:|-40-[self(300)]|"]; [constr

使用formatVertical,我可以设置视图的高度。但我想使这个值成为动态的,以便能够在所有不同的屏幕上显示相同的外观


有什么我可以做到的吗?

我想,你可以使用度量。 目标C解决方案:

NSString *format = [NSString stringWithFormat:@"H:|-10-[self]-10-|"];
NSString *formatVertical = [NSString stringWithFormat:@"V:|-40-[self(300)]|"];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:viewsDictionary]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatVertical options:0 metrics:nil views:viewsDictionary]];
raywenderlich.com提供的swift解决方案:

NSString *format = [NSString stringWithFormat:@"H:|-10-[self]-10-|"];
NSString *formatVertical = [NSString stringWithFormat:@"V:|-40-[self(height)]|"];
NSNumber *height = [NSNumber numberWithFloat:self.view.frame.size.height / 2];
NSDictionary *metrics = [NSDictionary dictionaryWithObjectsAndKeys:height, @"height", nil];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:viewsDictionary]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatVertical options:0 metrics:metrics views:viewsDictionary]]; 

我认为,您可以使用度量。 目标C解决方案:

NSString *format = [NSString stringWithFormat:@"H:|-10-[self]-10-|"];
NSString *formatVertical = [NSString stringWithFormat:@"V:|-40-[self(300)]|"];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:viewsDictionary]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatVertical options:0 metrics:nil views:viewsDictionary]];
raywenderlich.com提供的swift解决方案:

NSString *format = [NSString stringWithFormat:@"H:|-10-[self]-10-|"];
NSString *formatVertical = [NSString stringWithFormat:@"V:|-40-[self(height)]|"];
NSNumber *height = [NSNumber numberWithFloat:self.view.frame.size.height / 2];
NSDictionary *metrics = [NSDictionary dictionaryWithObjectsAndKeys:height, @"height", nil];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil views:viewsDictionary]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatVertical options:0 metrics:metrics views:viewsDictionary]]; 

视觉格式语言很好,除了有一些布局属性是它无法做到的——例如高度/宽度百分比和居中

“K.达维登科”的答案会有用。。。某种程度上。但它仍然为子视图设置了一个固定的高度。因此,如果您将其放置在错误的位置(例如,在布置superview之前),或者如果视图发生更改(例如设备旋转),您将无法获得所需的内容

由于在VFL格式之外添加
NSLayoutConstraint
非常简单,因此这是更好的选择:

private enum Metrics {
      static let padding: CGFloat = 15.0
      static let iconImageViewWidth: CGFloat = 30.0
    }
let metrics = [
      "horizontalPadding": Metrics.padding,
      "iconImageViewWidth": Metrics.iconImageViewWidth]

let topRowHorizontalFormat = """H:|-horizontalPadding-[iconImageView(iconImageViewWidth)]-[appNameLabel]-[skipButton]-horizontalPadding-|"""
let topRowHorizontalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: topRowHorizontalFormat,
    options: [.alignAllCenterY],
    metrics: metrics,
    views: views)
allConstraints += topRowHorizontalConstraints

let summaryHorizontalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: "H:|-horizontalPadding-[summaryLabel]-horizontalPadding-|",
    metrics: metrics,
    views: views)
allConstraints += summaryHorizontalConstraints

视觉格式语言很好,除了有一些布局属性它不能做-例如高度/宽度百分比和居中

“K.达维登科”的答案会有用。。。某种程度上。但它仍然为子视图设置了一个固定的高度。因此,如果您将其放置在错误的位置(例如,在布置superview之前),或者如果视图发生更改(例如设备旋转),您将无法获得所需的内容

由于在VFL格式之外添加
NSLayoutConstraint
非常简单,因此这是更好的选择:

private enum Metrics {
      static let padding: CGFloat = 15.0
      static let iconImageViewWidth: CGFloat = 30.0
    }
let metrics = [
      "horizontalPadding": Metrics.padding,
      "iconImageViewWidth": Metrics.iconImageViewWidth]

let topRowHorizontalFormat = """H:|-horizontalPadding-[iconImageView(iconImageViewWidth)]-[appNameLabel]-[skipButton]-horizontalPadding-|"""
let topRowHorizontalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: topRowHorizontalFormat,
    options: [.alignAllCenterY],
    metrics: metrics,
    views: views)
allConstraints += topRowHorizontalConstraints

let summaryHorizontalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: "H:|-horizontalPadding-[summaryLabel]-horizontalPadding-|",
    metrics: metrics,
    views: views)
allConstraints += summaryHorizontalConstraints

您希望它占superview(屏幕)的百分比吗?如果是这样的话,那么VFLexplain就不能做到这一点,而dynamicf的确切含义是:你不能。但是你能准确地解释一下你需要什么吗?所以,我的意思是对所有屏幕尺寸(iPhone 5、iPhone X、iPhone 7等)都有通用的限制。例如,我想让我的格式垂直于屏幕的0.5,这样无论iPhone屏幕有多高,高度都是所有屏幕类型的一半@DonMagIs有没有办法将通用高度值应用于所有不同的secreen尺寸?因为如果我设置为V:|-40-[self(300)]|这样的话,它对iphone5s来说会很大,但对iphone7来说会小一点@拉美多,你想让它占superview(屏幕)的百分比吗?如果是这样的话,那么VFLexplain就不能做到这一点,而dynamicf的确切含义是:你不能。但是你能准确地解释一下你需要什么吗?所以,我的意思是对所有屏幕尺寸(iPhone 5、iPhone X、iPhone 7等)都有通用的限制。例如,我想让我的格式垂直于屏幕的0.5,这样无论iPhone屏幕有多高,高度都是所有屏幕类型的一半@DonMagIs有没有办法将通用高度值应用于所有不同的secreen尺寸?因为如果我设置为V:|-40-[self(300)]|这样的话,它对iphone5s来说会很大,但对iphone7来说会小一点@云雀