- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 UIView
子类,它将是一个工具提示,可以出现在任何 View Controller 的底部,以显示提示/错误消息/成功消息/等等。工具提示 View 有两个 subview :左侧的 UILabel
和右侧的 UIView
,可以是任何东西(但通常用作 UIButton
).
TooltipView.h
@interface TooltipView : UIView
@property (nonatomic, readonly) UILabel *textLabel;
@property (nonatomic) UIView *rightView;
TooltipView.m
static CGFloat const kSubviewToSuperviewSpacing = 7.0f;
static CGFloat const kTextLabelToRightViewHorizontalSpacing = 7.0f;
@implementation TooltipView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
_textLabel = [[UILabel alloc] init];
_textLabel.numberOfLines = 0;
[_textLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:_textLabel];
}
return self;
}
- (void)setRightView:(UIView *)rightView {
if (_rightView != rightView) {
_rightView = rightView;
[self addSubview:_rightView];
[self setNeedsDisplay];
}
}
- (BOOL)translatesAutoresizingMaskIntoConstraints {
return NO;
}
- (void)updateConstraints {
self.didUpdateConstraints = YES;
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.textLabel
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:kSubviewToSuperviewSpacing]];
NSMutableDictionary *metricsDictionary = [@{@"subviewToSuperviewSpacing": @(kSubviewToSuperviewSpacing)} mutableCopy];
NSMutableDictionary *viewsDictionary = [@{@"textLabel": self.textLabel} mutableCopy];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-subviewToSuperviewSpacing-[textLabel]-subviewToSuperviewSpacing-|"
options:0
metrics:metricsDictionary
views:viewsDictionary]];
if (self.rightView) {
metricsDictionary[@"textLabelToRightViewHorizontalSpacing"] = @(kTextLabelToRightViewHorizontalSpacing);
viewsDictionary[@"rightView"] = self.rightView;
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-subviewToSuperviewSpacing-[rightView]-subviewToSuperviewSpacing-|"
options:0
metrics:metricsDictionary
views:viewsDictionary]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.rightView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeTrailing
multiplier:1.0f
constant:kSubviewToSuperviewSpacing]];
}
[super updateConstraints];
}
我还有一个 View Controller 来使用 UILabel
作为 rightView
来测试它。它是 UIViewController
的子类,它唯一的方法是重写 loadView
:
- (void)loadView {
TooltipView *tooltipView = [[TooltipView alloc] initWithFrame:CGRectZero];
tooltipView.textLabel.text = @"Test 1";
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectZero];
testLabel.text = @"Hello there";
[testLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
tooltipView.rightView = testLabel;
self.view = tooltipView;
最后,在我想要显示工具提示的 View Controller 中,我将 TooltipViewController 添加为 subview Controller 。最终,这将由某些事件触发,但出于测试目的,我将其添加到 viewWillAppear:
中。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.aViewController = [[TooltipViewController alloc] init];
self.aViewController.view.backgroundColor = [UIColor whiteColor];
[self addChildViewController:self.aViewController];
[self.view addSubview:self.aViewController.view];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|"
options:0
metrics:nil
views:@{@"view": self.aViewController.view}]];
[self.aViewController.view addConstraint:[NSLayoutConstraint constraintWithItem:self.aViewController.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:150.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.aViewController.view
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1.0f
constant:0.0f]];
[self.aViewController didMoveToParentViewController:self];
}
但是,在运行时,textLabel
和 rightView
的框架似乎设置正确,但是 tooltipView
的框架设置了到 CGRectZero
,这三个 View 都没有出现在屏幕上。
提前致谢!
编辑
我什至尝试过完全删除 textLabel
和 rightView
,所以只是一个带有前导、尾随、底部和高度约束的普通 UIView。没有什么是模棱两可的,但 View 的框架仍然是 CGRectZero
。
最佳答案
事实证明,解决方案只是在 TooltipView
的初始化程序中调用 setTranslatesAutoresizingMaskIntoConstraints
而不是覆盖该方法。这导致 View 正确显示。 h/t 亚伦汤普森 (https://twitter.com/aaptho/status/612815498661773312)。
关于ios - 使用程序化自动布局时容器 View 的框架设置为 CGRectZero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30928782/
我是一名长期开发人员,但对 DNS 的经验并不丰富。这是我的问题: 我们的应用程序在 Amazon EC2 上为客户启动服务器。一个客户希望为每台启动的服务器使用自定义 DNS,而不是 AWS 提供的
我正在尝试以编程方式添加几个从 TextViews 扩展到 RelativeLayout 的 Tiles。 我的代码如下。 RelativeLayout.LayoutParams params = n
如果我在黑莓 (5.0.0) 上的电话应用程序中输入电话号码,我可以点击菜单按钮,其中一个选项是“添加到联系人”,这将显示添加联系人屏幕,电话号码已经人口稠密。我想在我的应用程序中做同样的事情 - 调
我试图将 Android XML 的外观与以编程方式创建它的方式关联起来,但我惨遭失败。我读过几个引用资料,指出 View 的 LayoutParams 类型必须等于父级的类型,但我只是不理解它。 给
我正在尝试创建 Joda 2.2 DateTimeFormatter 来重构我的代码。我试图重现的行为是 private String getSemesterLabel() { StringB
我几乎所有的用户界面都是以编程方式完成的,并在 Interface Builder 中进行了轻微的修改。但是 99% 的 UI 完全是用代码完成的,因为我觉得通过以下方式可以获得一定程度的灵 acti
我正在尝试学习如何以编程方式创建不同的 UI 元素。我的 UITableView 面临以下问题.. 我有 2 个 .swift 文件,一方面,我们有.. struct Settings
我想使用ONLY编程语法创建页面布局,但我无法将带有左、中、右内容 Pane 的边框容器插入到主 Pane 的顶部 Pane 中布局(底部布局也是如此)。 每次我尝试使用内容 Pane 作为父级时,都
我需要一些指示从哪里开始: 从任何使用 ALSA 播放音频的应用程序到连接的扬声器,我想获取样本并进行一些音频处理。我无法控制播放器,我希望能够处理来自任何来源的音频。基本上它将是一个 UV 计,也许
我想以编程方式(因为文件路径是在运行时生成的)为 SQL 语句创建一个单独的日志文件。我的代码看起来像这样 public static void InitializeLogger(FileInfo
如何以编程方式关闭嵌入式 jetty 服务器? 我这样启动 jetty 服务器: Server server = new Server(8090); ... server.start(); serve
我有一个派生自 QGraphicsView 的自定义类,它实现了一个插槽调用 scrollHorizontal(int dx),里面的代码很简单 void CustomView::scrollHo
我正在尝试了解在 ios 中布局 UI 的最佳实践。具体来说,我试图了解以下优点/缺点:纯编程 UI、 Storyboard和 XIB,以及 ios 6.0+ 中的自动布局。 我已经习惯了纯程序化 U
我正在尝试做类似于提出此问题的用户正在尝试做的事情: HTTPS Request From a Credential Provider DLL 关于用户个人资料的组成部分,我找到了this . Win
所以我试图为一些布局约束设置动画,但运气很差,我什么也没看到,然后我收到一条错误消息,说明它如何不能同时满足所有约束等。 我正在使用一个名为 PullableView 的类谁的动画用的是旧风格[UIV
我有大量的 Python 代码,需要对其施加符合 pep8 的样式/格式。 pep8 有各种规则的变体(如 this one by a coworker ),但最难的是处理分割太长的行和格式化修改后的
我试图让 ZeroClipboard API 工作,但看起来 setText() 函数没有效果。 提供简单示例 > here Copy to Clipboard ZeroClipboa
假设我有一个这样的错误应用程序: using System; namespace ConsoleApplication1 { class Program { stati
我是 Android 开发的新手,但遇到以下问题。我正在尝试以编程方式创建多个 ImageView 并使用 Picasso 加载图像,但我无意中发现了以下问题。 编辑:我想要实现的是我希望使用 wid
我需要以编程方式将 RDP 连接到虚拟机 (XP SP3/.NET3.5/VS 2008),(凭据已保存在 .rdp 文件中)并进行 UI 自动化测试。由于我们的域安全性,我需要以编程方式对交互式登录
我是一名优秀的程序员,十分优秀!