iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)

Posted

技术标签:

【中文标题】iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)【英文标题】:Height of programmatically created UIProgressView is ignored in iOS 7.1 (always 2) 【发布时间】:2014-03-25 20:25:40 【问题描述】:

以编程方式将 UIProgressView 添加到视图会忽略 size.height 值,这显然是由于 NSAutoresizingMaskLayoutConstraint 始终为 2。除了增加高度之外,关于 UIProgressView 的其他所有内容都是标准的。一段代码 sn-p where progressViewFrame.size.height = 40.0:

  self.progressView = [[UIProgressView alloc] init];
  // initWithFrame produces the same issue
  [self.progressView setFrame:progressViewFrame];
  [self addSubview:self.progressView];

导致标准高度为 2。

强制附加高度 40.0 约束:

  [self addConstraint:[NSLayoutConstraint
                         constraintWithItem: self.progressView
                         attribute: NSLayoutAttributeHeight
                         relatedBy: NSLayoutRelationEqual
                         toItem: nil
                         attribute: NSLayoutAttributeNotAnAttribute
                         multiplier: 1.0
                         constant: 40.0]];

通过报告以下(预期的)冲突来说明问题:

(
 "<NSLayoutConstraint:0x16d74b70 V:[UIProgressView:0x16d72800(40)]>",
 "<NSAutoresizingMaskLayoutConstraint:0x16d69e60 h=--& v=--& V:[UIProgressView:0x16d72800(2)]>"
)

这似乎与在 IB 中使用 40.0 高度约束创建更高的 UIProgressView 有关,这会生成 Expected: height=40 Actual: height=2 警告(但显示正确)。

这些问题出现在 ios 7.1 中,我正在为上面的程序化 UIProgressView 案例寻找解决方案。我不担心 7.0 之前的 iOS 版本,我希望尽可能少地破解标准的默认 UIProgressView。 (我只是想让它更高。)

提前感谢您的任何建议。

【问题讨论】:

【参考方案1】:

看来唯一可行的策略是完全使用 LayoutConstraints 来消除问题。这是我最终使用的(感谢 John Griffith 的建议):

self.progressView = [[UIProgressView alloc] init];
self.progressView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview: self.progressView];

NSDictionary *views = @@"progressview": self.progressView;
NSDictionary *metrics = @@"height": @(progressBarHeight),
                          @"margin": @(horizontalMargin),
                          @"bottomspace": @(bottomMargin);
[self addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat: @"H:|-(margin)-[progressview]-(margin)-|"
                           options: 0
                           metrics: metrics
                           views: views]];
[self addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat: @"V:[progressview(height)]-(bottomspace)-|"
                           options: 0
                           metrics: metrics
                           views: views]];

【讨论】:

以上是关于iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios swift 中以编程方式创建自动布局等宽约束?

如何在 ios 中以编程方式添加约束

如何在ios swift中以编程方式创建自动布局等宽度约束?

在 iOS 中以编程方式生成视图

无法在 Xcode 中以编程方式创建地图(Big Nerd Ranch IOS 编程:第 6 章 p97)

在 IOS 中以编程方式设置动作侦听器