我想使用 swift 创建自己的自定义 UILabel,但在使用 init 超类时遇到了框架问题。
这是我之前的情况:
let label = UILabel()
Run Code Online (Sandbox Code Playgroud)
我以前基本上使用普通的 UILabel。首先我的问题是,这个框架是如何设定的?因为当我进入 UILabel 类时,它继承自 UIView 并且 UIView 内的 init 方法需要一个框架。那么这个框架是如何创建的呢?
然后,这将我带到我自己的自定义 UILabel,我将其称为 TimeLabel。这是它的实现:
class TimeLabel: UILabel {
var clientName: String?
var time: Time?
init(name:String, time:Time) {
self.clientName = name
self.time = time
super.init(frame: ??)
}
required init?(coder aDecoder: NSCoder) {
super.init(frame:??)
}
}
Run Code Online (Sandbox Code Playgroud)
现在这链接到第一个问题,我应该从哪里获取这个框架?我之前调用 UILabel 时没有提供框架?我该如何处理这个问题?
所以我想以编程方式将 UILabel 在视图中水平和垂直居中。我关注了这个主题,但它不起作用。我怎样才能做到这一点?
p/s:这是我的代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let noDataLabel = UILabel()
noDataLabel.text = "No data :("
noDataLabel.textColor = UIColor.redColor()
noDataLabel.font = UIFont.systemFontOfSize(20)
noDataLabel.sizeToFit()
self.view.addSubview(noDataLabel)
NSLayoutConstraint(item: noDataLabel, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1.0, constant: 0.0).active = true
NSLayoutConstraint(item: noDataLabel, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1.0, constant: 0.0).active = true
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从左到右逐步更改 UILabel 的文本颜色。我发现我可以使用 UIView 的动画:
[UIView transitionWithView:_label duration:1 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
_label.textColor = [UIColor redColor];
} completion:nil];
Run Code Online (Sandbox Code Playgroud)
但问题是我的情况没有选择:从左到右逐渐进行。
然后我找到了一种通过调用以下命令来逐个字母地更改文本颜色的方法:
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(yourSelector) userInfo:nil repeats:NO];
- (void)yourSelector
{
[_string setAttributes:@{NSForegroundColorAttributeName: [UIColor redColor]} range:NSMakeRange(_index, 1)];
[_label setAttributedText:_string];
_index++;
}
Run Code Online (Sandbox Code Playgroud)
但这里的问题是,我希望动画更像是一个字母一个字母,但每个字母也有动画,就像有两个不同颜色的标签放置在同一位置(黑色覆盖红色),然后从左到右对蒙版进行动画处理向右隐藏黑色标签,以便红色标签逐渐显示。
那么有没有办法实现这一点呢?
我UILabel在我的应用程序中创建了一个 Swift 子类来管理它在所有视图中的样式,以便以后更容易修改样式。我知道要将字符串转换为大写,我可以使用其中任何一个uppercased()来实现。
但是,问题在于当我在text 属性的子类中使用uppercased()或时,它在运行时不起作用。奇怪的是它在情节提要上正确呈现(使用),但在运行时,它显示了未大写的字符串。capitalizedUILabel@IBDesignable
例如,我在UILabel子类中有一段与此类似的代码:
textColor = ...
font = UIFont(name: "Avenir-Medium", size: 12.0)
text = text!.uppercased()
Run Code Online (Sandbox Code Playgroud)
然后在视图控制器中,我有一个类似于这样的代码:
label_noWeightMessage.text = "No weight logs this week..."
Run Code Online (Sandbox Code Playgroud)
除了大小写更改外,颜色和字体应用正确。我在这里错过了什么吗?
在故事板中,文本显示为“NO WEIGHT LOGS THIS WEEK...”但在运行时的模拟器中,它恢复到原始情况。
我知道我可以只用大写字母输入文本。但这不是我想要的。我希望能够在所有屏幕上重复使用样式,而无需重新键入所有UILabel文本,只需在一处更改即可。
谢谢!
我正在尝试对齐 UILabel 中的文本,但它不起作用。文本打印时标签的第二行紧贴标签的左侧。如何使两条线在标签中心对齐?谢谢。
let bioTextView: UILabel = {
let tv = UILabel()
tv.text = "This is sample text for a bio label for a user on this platform."
tv.backgroundColor = .clear
tv.textColor = .white
tv.lineBreakMode = .byWordWrapping
tv.numberOfLines = 0
tv.textAlignment = NSTextAlignment.right
return tv
}()
Run Code Online (Sandbox Code Playgroud)
请找到以下问题的屏幕截图。我的要求是将文本放在拖线中。
在视图为比例设置动画之前,我希望在没有动画的情况下旋转视图。如果我之后有动画,我现在拥有它的方式会忽略我的初始视图旋转。
label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
animateLabel(label:label)
func animateLabel(label:UILabel) {
label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)
UIView.animate(withDuration: 0.2, animations: {
label.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
},
completion: { _ in
UIView.animate(withDuration: 0.1) {
label.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
}
})
}
Run Code Online (Sandbox Code Playgroud)
更新:我如何用马特的回答更新我的代码,以便它正确动画:
我首先将初始旋转设置为变换变量,然后在调用 animateLabel 时发送它:
var transforms: CGAffineTransform = .identity
transforms = transforms.concatenating(CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180)))
animateLabel(label:label, transforms:transforms)
Run Code Online (Sandbox Code Playgroud)
我连接比例并将变换设置为修改后的变换。然后我可以对实际动画使用缩放比例:
func animateLabel(label:UILabel, transforms:CGAffineTransform) {
transforms.concatenating(CGAffineTransform(scaleX: 0.6, y: 0.6))
label.transform = transforms
UIView.animate(withDuration: 0.2, …Run Code Online (Sandbox Code Playgroud) 我试图在 tableView 单元格中为我的 UILabel 实现“显示更多/显示更少”功能。我试过在网上搜索解决方案,但它们似乎都过时了。
标题文本应该有 2 行,如果超过 2 行,它将扩展为全文
lazy var captionText: UILabel = {
let lbl = UILabel()
lbl.numberOfLines = 2
lbl.lineBreakMode = .byWordWrapping
return lbl
}()
func setupUI(viewModel: FeedModel) {
captionText.text = viewModel.postDescription
}
Run Code Online (Sandbox Code Playgroud)
我喜欢最终的结果是这样的:
我在CustomViewController的方法viewDidLoad中实现了以下代码,根据我的需要打开/关闭标签可见性:
- (void)viewDidLoad
{
[super viewDidLoad];
myLabel.hidden=NO;
if (x==1) {
myLabel.hidden=YES;//here is correctly hidden
}
else {
[self.view bringSubviewToFront:myLabel];
if(!myLabel.hidden){
NSLog(@"I'm not hidden!");// the log displays correctly! so myLabel is not Hidden but I can't see it!
[self.view bringSubviewToFront:myLabel];
}
}
Run Code Online (Sandbox Code Playgroud)
MyLabel在CustomViewController.h("IBOutlet UILabel*myLabel;")中声明,并连接到Xib文件中对应的UILabel接口.
为什么即使它的"隐藏"属性是假的,我也看不到它?
Ps将UILabel文本分配给xib文件中的UILabel接口
谢谢卢卡
解决了感谢伙计们我觉得很愚蠢.标签已经不在舞台上所以我可以看到它.我只是重新定位它现在它工作正常
我有一个带有自定义原型单元格的表格视图,单元格上有3个不同的标签.如何访问这些标签?我需要改变他们的文本.我到处搜索过,在这种情况下找不到能帮助我的东西.我有以下代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"basicCell" forIndexPath:indexPath];
//change cell's 3 labels' text here
return cell;
}
Run Code Online (Sandbox Code Playgroud)
如何访问上面单元格的3个不同标签?
uilabel ×10
ios ×8
swift ×6
objective-c ×3
uitableview ×2
anchor ×1
animation ×1
autolayout ×1
cocoa-touch ×1
iphone ×1
rotation ×1
text ×1
transform ×1
uitextfield ×1
uitextview ×1
uiview ×1
xcode ×1