【问题标题】:iOS8 UIView width 320iOS8 UIView 宽度 320
【发布时间】:2015-08-01 02:24:13
【问题描述】:

有一个问题:我设置了一个名为 ZHLockView 的自定义视图。我把它放在情节提要中并设置了约束。但是我在- (id)initWithCoder:(NSCoder *)aDecoder中无法得到正确的宽度,总是320,我该怎么做才能得到正确的宽度?

最后我知道在- (void)layoutSubviews,我可以得到正确的宽度,但它会去两次。有更好的主意吗?

【问题讨论】:

  • “正确的宽度”是什么意思?你期望的宽度是多少?您设置了哪些限制条件?
  • 该视图尚未在initWithCoder: 中布局,因此它只会包含您在情节提要中提供的框架。获得正确宽度的最佳位置取决于您要使用它做什么。
  • 主要约束是宽度等于superView.width。我想在不同的设备上得到正确的宽度
  • 视图本身不应该担心填充它的超级视图。超级视图在将您的视图添加为子视图时应该添加这些约束。
  • @ZhiChang 检查您在情节提要中选择了哪款 iPhone Retina。并检查您的视图的宽度

标签: ios uiview storyboard constraints


【解决方案1】:

视图将在第一次启动时加载 xib 中的值,接下来当自动布局引擎进行第一次传递时,它将根据约束集设置为新值。
为什么需要知道尺寸?自动布局不关心它。
-layoutSubviews-viewWillLayout-viewDidLayout 在布局引擎需要更新时调用,这可能意味着显示视图之前的不同时间。

【讨论】:

  • 因为在.m文件中,我使用了一些'for'语句,比约束方便
  • 如果你使用自动布局,你必须忘记手动改变框架,你应该只改变约束。即使它现在似乎可以工作,它也应该在不同的 iOS 次要版本之间中断
【解决方案2】:

代码在这里

对象

#define KScreenWidth [UIScreen mainScreen].bounds.size.width
CGFloat height = 0;
CGFloat margin = (KScreenWidth - columnCount * btnW) / (columnCount + 1);
for (int i = 0; i < btnCount; i++) {
    int row = i / columnCount;
    int column = i % columnCount;
    CGFloat btnX = margin + column * (btnW + margin);
    CGFloat btnY = row * (btnW + margin);
    height = btnH + btnY;
    ZHButtonView *button = [[ZHButtonView alloc] initWithFrame:CGRectMake(btnX, btnY, btnW, btnH)];
    button.userInteractionEnabled = NO;
    button.currentIndex = i;
    [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
    [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
    [self addSubview:button];
}

【讨论】:

  • 好的,您的代码与视图的框架无关。我想你可以在 viewDidLoad 中调用它。它应该可以正常工作。
【解决方案3】:

看,你得到的宽度是 320,因为你的视图在故事板上是那个大小。

如果view的宽度等于superview,确实又等于设备的宽度,你可以使用下面的代码随时获取view的宽度,不用担心在哪里写。

斯威夫特:-

CGFloat width  = CGRectGetWidth(UIScreen.mainScreen.bounds);
CGFloat height = CGRectGetHeight(UIScreen.mainScreen.bounds);

Objective-C :-

CGFloat width  = CGRectGetWidth([[UIScreen mainScreen] bounds]);
CGFloat height = CGRectGetHeight([[UIScreen mainScreen] bounds]);

希望你能理解并帮助你.. :)

【讨论】:

  • 谢谢,我知道了。但是如果superView的frame不是屏幕宽度呢?
  • 那么,你想在代码中实现什么?请分享代码。
  • 好的,我在这里找到了一个很好的答案.. 看看.. stackoverflow.com/questions/28501903/… 希望能解决你的问题。让我知道.. :)
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多