我刚刚开始学习iOS的AutoLayout,并看了一下Visual Format Language.
这一切都很好,除了一件事:我只是无法在其超级视图中找到中心.
这可能与VFL有关,还是我需要自己手动创建约束?
我倾向于只将必需品(存储属性,初始化器)放入我的类定义中,并将其他所有内容移动到自己的extension类中,有点像extension我将与之合并的每个逻辑块// MARK:.
例如,对于UIView子类,我最终会得到与布局相关的东西的扩展,一个用于订阅和处理事件等等.在这些扩展中,我不可避免地必须覆盖一些UIKit方法,例如layoutSubviews.我从未注意到这种方法有任何问题 - 直到今天.
以此类层次结构为例:
public class C: NSObject {
public func method() { print("C") }
}
public class B: C {
}
extension B {
override public func method() { print("B") }
}
public class A: B {
}
extension A {
override public func method() { print("A") }
}
(A() as A).method()
(A() as B).method()
(A() as C).method()
Run Code Online (Sandbox Code Playgroud)
输出是A B C.这对我来说没什么意义.我读到有关静态分派的协议扩展,但这不是协议.这是一个常规类,我希望在运行时动态调度方法调用.显然,呼叫C至少应该动态调度和产生C?
如果我删除继承NSObject …
对于我实际想要实现的目标,存在很多困惑.所以请让我重新提出我的问题.它很简单:
如何苹果内部中心文本
UILabel的-drawTextInRect:?
以下是我为什么要寻找Apple中心文本方法的背景:
但是,有些地方我不能注入这个算法,甚至没有方法调整.了解他们使用的确切算法(或相当的算法)将解决我的个人问题.
这是一个可以试验的演示项目.如果您对Apple的实现问题感兴趣,请查看左侧(基本UILabel):文本在使用滑块增加字体大小时上下跳动,而不是逐渐向下移动.
同样,我正在寻找的只是一个实现-drawTextInRect:与基数相同UILabel- 但没有调用super.
- (void)drawTextInRect:(CGRect)rect
{
CGRect const centeredRect = ...;
[self.attributedText drawInRect:centeredRect];
}
Run Code Online (Sandbox Code Playgroud) 就在最近,我开始从适用于iOS的Google Analytics静态库中获取新的控制台警告.我只关注在实际设备上获取以下日志,而不是在模拟器中.
CoreData: warning: Unable to load class named 'GAIProperty' for entity 'GAIProperty'. Class not found, using default NSManagedObject instead.
CoreData: warning: Unable to load class named 'GAIHit' for entity 'GAIHit'. Class not found, using default NSManagedObject instead.
idfa class missing, won't collect idfa
任何想法可能意味着什么,为什么会发生以及如何解决问题?
我有一个自定义UITableView子类,我在其中重写+accessInstanceVariablesDirectly以返回NO以确保无法使用KVC设置没有setter的属性.
从视图层次结构中删除此表视图时,应用程序崩溃 - 有时 - 现在是奇怪的部分:仅当启用了辅助功能时!(即,可访问性检查器可见,或者您在物理设备上启用了辅助功能)
如果我不覆盖+accessInstanceVariablesDirectly,一切正常.我想可能UITableView依赖于直接访问一些实例变量 - 但是如果我可以通过使用它来破坏超类,那么这个方法有什么意义呢?有没有办法指定每个属性的这种行为,比如+automaticallyNotifiesObserversForKey:?但是,只有在启用"辅助功能"时才会出现此问题,我感到困惑.
我尝试用各种仪器分析项目,但没有成功.
你可以在这里找到一个复制问题的最小项目.我非常感谢有关为什么会发生这种情况或如何实现我想要的东西的任何指示.
所以我只是尝试UITableViewHeaderFooterView通过重写来按照我想要的方式对标签进行子类化和对齐-layoutSubviews.
但是,当我调用super并更改标签frame时,应用程序似乎陷入了无限-layoutSubviews循环.
我的代码看起来像这样:
- (void)layoutSubviews
{
[super layoutSubviews];
self.textLabel.frame = CGRectMake(10.0, 10.0, 300.0, 40.0);
}
Run Code Online (Sandbox Code Playgroud)
有想法该怎么解决这个吗?
我有一组想要以下列模式显示的图像:
[1] [4] [7] [10] [13]
[2] [5] [8] [11] ...
[3] [6] [9] [12]
Run Code Online (Sandbox Code Playgroud)
我知道我总是可以手动将3个图像组合成一个div.column或类似的东西,但我想用尽可能简单的HTML来实现这个布局.图像是225x150.
目前,我有以下HTML:
<div class='album'>
<img src='img/01.jpg' />
<img src='img/01.jpg' />
...
</div>
Run Code Online (Sandbox Code Playgroud)
这是我的样式表:
.album {
background: #faa;
display: block;
-webkit-column-count:2;
-webkit-column-gap: 10px;
height: 450px;
width: 460px;
}
.album img {
display: block;
width: 100%;
}
Run Code Online (Sandbox Code Playgroud)
规范中的第8.2章描述了如果我指定高度并且内容不适合,则根据需要创建更多列,这基本上就是我想要的.
如您所见,我指定了背景颜色.album.这只覆盖前两列,因为我将宽度设置为460px.但是,我真的需要一个具有相册内容的确切大小/宽度的元素,即包含具有该确切大小的相册的元素.
我试过的任何可能性似乎都没有.(100%,也auto玩过overflow)
有没有人知道如何为我的相册创建这样的包装元素?
我有一个容器视图 - 让我们称之为套接字视图 - 它有一个子视图,它是内容视图 - 让我们称之为插件视图.此插件视图可以为nil,即套接字视图当前为空.如果它确实包含一个插件视图,它将占用整个套接字的空间,即它的框架是套接字的边界.从外观来看,你甚至不能告诉它实际上有两个视图,因为插件视图总是与套接字完全相同.
我正在努力让动画正常工作:如果插件视图存在并在动画之前布局,一切都按预期工作.但是,如果我只在动画已经运行时才设置套接字的插件视图,我会得到一个不希望的效果:
插件视图布局到动画结束时的位置,并且不会在其插槽旁边进行动画处理.我希望它看起来像是一直存在但只是刚才可见,即插件视图(及其子视图)应该在套接字旁边动画,即使我在动画进行过程中添加它.
我怎样才能实现这种行为?
我的想法:显然插件视图必须布置两次:一次用于最终位置,再一次用于套接字视图开始动画或添加的位置.我可以计算这个帧,在没有动画的情况下应用它,并在新的动画块中动画到最终帧.为了使动画定时保持一致,我需要具有相同的曲线和持续时间,但过去开始动画或以某种方式转发动画.这可能吗?是否有其他方法具有插头观点是完全的宽度和高度在任何时候?
作为Rob的回答的后续内容,以下是我正在寻找的更多细节:
套接字视图是动画的,因为它的所有者的绑定大小已更改.您可以将其视为表视图中的全宽度单元格.
插件视图可以包含其自身的子视图,如图像视图,标签等.这些也应该加入到套接字视图的动画中,就好像它们自动画开始以来一直存在.
虽然理论上有一个新动画可以在一个已经运行时启动,但我并不介意这个边缘情况下的行为.
在动画运行时,用户无需与插件视图交互; 无论如何,这很可能发生在界面方向改变期间.
插件视图可能会决定在动画时由于异步模型更新而更改其内容,但这又是一个边缘情况,我不介意动画在这种情况下看起来不完美.但是,它的大小不会改变 - 它总是与插件视图的大小相同.
我决定使用NSSecureCoding它NSCoding,但我无法让它工作.
我希望以下代码失败,因为我正在编码NSString但尝试解码NSNumber.但是,初始化对象时不会抛出异常.
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
// prints '1' as expected
NSLog(@"%d", coder.requiresSecureCoding);
// unexpectedly prints 'foo' (expecting crash)
NSLog(@"%@", [coder decodeObjectOfClass:NSNumber.class forKey:@"bar"]);
return [super init];
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:@"foo" forKey:@"bar"];
}
Run Code Online (Sandbox Code Playgroud)
这是我用来测试上面代码片段的代码:
MyClass *object = [[MyClass alloc] init];
NSMutableData *const data = [[NSMutableData alloc] init];
NSKeyedArchiver *const archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
archiver.requiresSecureCoding = YES;
[archiver encodeObject:object forKey:@"root"];
[archiver finishEncoding];
NSKeyedUnarchiver *const …Run Code Online (Sandbox Code Playgroud) 我有一个UITableView与包含UILabel的单元格.UILabel有一个自定义的UIEdgeInset.我将UILabel子类化并设置UIEdgeInsets如下:
override func drawText(in rect: CGRect) {
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
override var intrinsicContentSize: CGSize {
var contentSize = super.intrinsicContentSize
contentSize.width += leftInset + rightInset
contentSize.height += topInset + bottomInset
return contentSize
}
Run Code Online (Sandbox Code Playgroud)
但是当我在UILabel中有更多行时,标签有时会被截断.我已经将行高配置为UITableViewAutomaticDimension并设置了estimatedRowHeight.约束也很好.问题似乎是我正在设置UIEdgeInsets,因为如果我不自定义它可以正常工作.
可能我应该告诉单元格在设置insets后更新约束,但到目前为止我无法做到这一点.
故事板中添加的约束.Bottom,Top,Leading并且Trailing都与上海华盈(UITableViewCell中).所有常量都设置为0.
在cellForRowAtIndexPath代码中如下:
let cell = tableView.dequeueReusableCell(withIdentifier: "AnswersCell", for: indexPath) as! AnswerCell
cell.answerLabel.text = alternatives[indexPath.row]
return cell
Run Code Online (Sandbox Code Playgroud) ios ×8
layout ×3
objective-c ×3
uitableview ×3
autolayout ×2
swift ×2
uilabel ×2
calayer ×1
cocoa ×1
core-data ×1
css ×1
css3 ×1
grid-layout ×1
iphone ×1
nscoding ×1
overflow ×1
swift2 ×1
typography ×1
uiview ×1