小编And*_*rea的帖子

setNeedsLayout与setNeedsUpdateConstraints和layoutIfNeeded vs updateConstraintsIfNeeded

我知道汽车布局链基本上包含3个不同的过程.

  1. 更新约束
  2. 布局视图(这里是我们计算框架的地方)
  3. 显示

我不完全清楚的是-setNeedsLayout和之间的内在差异-setNeedsUpdateConstraints.来自Apple Docs:

setNeedsLayout

如果要调整视图子视图的布局,请在应用程序的主线程上调用此方法.此方法记录请求并立即返回.由于此方法不强制立即更新,而是等待下一个更新周期,因此可以在更新任何视图之前使用它来使多个视图的布局无效.此行为允许您将所有布局更新合并到一个更新周期,这通常会提高性能.

setNeedsUpdateConstraints

当自定义视图的属性以会影响约束的方式更改时,可以调用此方法以指示需要在将来的某个时刻更新约束.然后系统将调用updateConstraints作为其正常布局传递的一部分.在需要之前立即更新约束可确保在布局过程之间对视图进行多次更改时,不会不必要地重新计算约束.

当我想在修改约束后为视图设置动画并为我通常调用的更改设置动画:

[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.modifConstrView setNeedsUpdateConstraints];
        [self.modifConstrView layoutIfNeeded];
    } completion:NULL];
Run Code Online (Sandbox Code Playgroud)

我发现,如果我使用-setNeedsLayout的,而不是-setNeedsUpdateConstraints一切都按预期工作,但如果我改变-layoutIfNeeded-updateConstraintsIfNeeded,动画将不会发生.
我试图得出自己的结论:

  • -updateConstraintsIfNeeded 仅更新约束但不强制布局进入该过程,因此仍保留原始帧
  • -setNeedsLayout也叫-updateContraints方法

那么什么时候可以使用一个而不是另一个?关于布局方法,我是否需要在约束或父视图中更改的视图上调用它们?

objective-c ios autolayout nslayoutconstraint

220
推荐指数
2
解决办法
9万
查看次数

视图(或图层)何时需要屏幕外渲染?

你好,
本周末我开始观看2011年WWDC视频.我发现了关于iOS的非常有趣的话题.我的最爱是关于性能和图形,但我发现其中两个显然是矛盾的.当然有一些我没有得到的东西.我正在谈论的会议是理解UIKit渲染-121和抛光你的应用程序-105.
不幸的是,2011年的示例代码仍然无法下载,因此很难获得整体视图.在一个会话中,他们解释说,在scrollview等可视化期间,大多数时候应该避免屏幕外渲染.他们修复了示例代码中的性能问题,几乎在-drawRect方法中绘制了所有内容.在另一个会话中,性能问题(在表视图上)似乎是由于表单元格的-drawRect方法中的代码过多.
首先我不清楚当系统需要OffScreen渲染时,我在视频中看到一些石英功能如:cornerRadious,shadowOffset,shadowColor需要它,但确实存在一般规则?
其次我不知道我是否理解得很好,但似乎没有屏幕外渲染添加图层或视图是要走的路.我希望有人能为此带来光明......
谢谢,
安德烈

rendering view layer ios

48
推荐指数
3
解决办法
2万
查看次数

我什么时候需要设置CALayer的contentsScale属性?

文档中, Apple声明在以下情况下需要考虑图层的比例因子:

  • 创建具有不同比例因子的其他Core Animation图层,并将它们组合成自己的内容
  • 直接设置Core Animation图层的contents属性

最后的陈述对我来说并不完全清楚.他们还说:

直接使用Core Animation图层提供内容的应用程序可能需要调整其绘图代码以考虑比例因子.通常,当您在视图的drawRect:方法中绘制时,或者在图层委托的drawLayer:inContext:方法中绘制时,系统会自动调整图形上下文以考虑比例因子.

小规模还是永远?这仅适用于视图的托管后备层或我添加为后备层的子层的每个层?因为他们也说:

如果应用程序创建没有关联视图的图层,则每个新图层对象的比例因子最初都设置为1.0.如果不更改该比例因子,并且随后在高分辨率屏幕上绘制图层,则会自动缩放图层的内容以补偿比例因子的差异.如果您不希望缩放内容,可以将图层的比例因子更改为2.0,但如果您这样做而不提供高分辨率内容,则现有内容可能会显得比您预期的要小.要解决该问题,您需要为图层提供更高分辨率的内容.


我在想象一个没有视图的图层时遇到困难,我可以想象一下图层的层次结构,但是一旦我想要显示它们,我应该将它添加为视图背衬层的子层次结构,或者确实存在一些其他方法来使用它们(比如在上下文中创建和渲染)?

Core Animation的合成引擎查看每个图层的contentsScale属性,以确定在合成期间是否需要缩放该图层的内容.如果应用程序创建没有关联视图的图层,则每个新图层对象的比例因子最初都设置为1.0.如果不更改该比例因子,并且随后在高分辨率屏幕上绘制图层,则会自动缩放图层的内容以补偿比例因子的差异.如果您不希望缩放内容,可以将图层的比例因子更改为2.0,但如果您这样做而不提供高分辨率内容,则现有内容可能会显得比您预期的要小.要解决该问题,您需要为图层提供更高分辨率的内容.

这究竟意味着什么?当我做这样的事情时,layer.contents = (id)image.CGImage我需要设置contentsScale.
当我的图层绘制调用委托方法的内容drawLayer:inContext:并且图层不是视图的背景层时,是否还需要设置它 ?

macos objective-c calayer ios

31
推荐指数
3
解决办法
9829
查看次数

协议扩展编译器错误中的Swift 2.2 #selector

我有一个协议扩展,它曾经在swift 2.2之前完美地工作.

现在我有一个警告,告诉我使用新的#selector,但如果我添加它

没有使用Objective-C Selector声明的方法.

我尝试在这几行代码中重现这个问题,可以很容易地复制并粘贴到游乐场

  protocol Tappable {
    func addTapGestureRecognizer()
    func tapGestureDetected(gesture:UITapGestureRecognizer)
}

extension Tappable where Self: UIView {
    func addTapGestureRecognizer() {
        let gesture = UITapGestureRecognizer(target: self, action:#selector(Tappable.tapGestureDetected(_:)))
        addGestureRecognizer(gesture)
    }
}

class TapView: UIView, Tappable {
    func tapGestureDetected(gesture:UITapGestureRecognizer) {
        print("Tapped")
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个建议在协议中附加到该方法@objc,但是如果我这样做也要求我将它添加到实现它的类中,但是一旦我添加该类就不再符合协议,因为它不会好像在协议扩展中看到了实现.
我该如何正确实现?

protocols ios swift

25
推荐指数
3
解决办法
8892
查看次数

_UIReplicantView和snapshotViewAfterScreenUpdates如何获取其内容?

-renderInContext:自从它出现以来已被广泛使用,但由于不可能渲染OpenGL层,AVPreviewLayer(可能因为是一种OpenGL层)而且我仍然无法正确渲染CATiledLayer.
随着iOS7引入了2个新的API来获取屏幕截图,一个是-snapshotViewAfterScreenUpdates:返回一个特定的视图(_UIReplicantView)而-drawViewHierarchyInRect:afterScreenUpdates:最后一个是一种替代-renderInContext,不幸的是它似乎有相同的限制.
-snapshotViewAfterScreenUpdates:它似乎也适用于OpenGL和AVPreviewLayer,不幸的是,如果你想做特定的动画或使用内容作为某些东西(如uibutton)的背景,这样的视图不是很有用.我试图从返回的视图中删除内容,但我仍然没有运气.
有人试过吗?

iphone screenshot uiview ios

24
推荐指数
1
解决办法
4358
查看次数

即使表格大于视图,TableViewController也不会闪烁滚动指示器

我对TableViewController有一个奇怪的问题.在文档中,它表示当表格"超大"时,tableViewController还处理方法-flashScrollIndicators,尊重可见区域.

My app consists in 3 nav controller loaded in a tab controller. Each nav controller has as root view controller a subclass of a table view controller. Each "model" is populated from a plist file, that loads its contents into an array in the -viewDIdLoad, later everything is passed to the table. Everything is loaded programmatically no IB.

I've found out in my app that when it loads the first view (a nav controller with a table view controller …

iphone sdk scrollbar indicator tableview

15
推荐指数
2
解决办法
7991
查看次数

选择视频后,UIImagePickerController坚持在iOS10模拟器上压缩视频

我有这个应用程序,总是在iOS9上正常工作,现在我已经将swift代码迁移到3.0并添加了所需的plist行来访问照片库.
在尝试使用UIImagePickerController模拟器从相机胶卷中选择视频(通过拖动预加载)时,它总是卡在"压缩视频"上,并且不会回调委托方法.

   @IBAction func videoFromLibrary(_ sender: UIBarButtonItem) {
        picker.allowsEditing = false
        picker.sourceType = .photoLibrary
        picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        picker.modalPresentationStyle = .popover
        present(picker, animated: true, completion: nil)
        picker.popoverPresentationController?.barButtonItem = sender
    }
Run Code Online (Sandbox Code Playgroud)

使用真实设备它工作正常,它似乎是一个苹果bug,我想知道是否有人有这个问题或我错过了一些东西,以便UIImagePickerController在模拟器上使用视频正确再次工作(或者如果有一个解决方法).

uiimagepickercontroller ios swift ios10 xcode8

10
推荐指数
1
解决办法
949
查看次数

使用CAAnimationGroup进行序列动画

我正在尝试制作一系列动画,我在CAAnimationGroup正确的类中找到了实现该对象.在实践中,我添加了一个视图不同的子视图,我想用弹跳效果动画他们的条目,事实是我想看到他们的动画发生在前一个完成后.我知道我可以设置代表,但我认为这CAAnimationGroup是正确的选择.
后来我发现组动画只能属于一个图层,但我需要它在屏幕上的不同图层上.当然在托管层上不起作用.一些建议?

- (void) didMoveToSuperview {
    [super didMoveToSuperview];
    float startTime = 0;
    NSMutableArray * animArray = @[].mutableCopy;
    for (int i = 1; i<=_score; i++) {
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: self.greenLeaf];
        UIImageView * greenLeafImageView = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
        greenLeafImageView.image = [UIImage imageNamed:@"greenLeaf"];
        CGPoint leafCenter =  calculatePointCoordinateWithRadiusAndRotation(63, -(M_PI/11 * i) - M_PI_2);
        greenLeafImageView.center = CGPointApplyAffineTransform(leafCenter, CGAffineTransformMakeTranslation(self.bounds.size.width/2, self.bounds.size.height));
        [self addSubview:greenLeafImageView];

        //Animation creation
        CAKeyframeAnimation *bounceAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
        greenLeafImageView.layer.transform = CATransform3DIdentity;
        bounceAnimation.values = @[
                                  [NSNumber numberWithFloat:0.5],
                                  [NSNumber numberWithFloat:1.1],
                                  [NSNumber …
Run Code Online (Sandbox Code Playgroud)

cocoa cocoa-touch core-animation objective-c ios

9
推荐指数
1
解决办法
1万
查看次数

"NSArray'没有名为'append'的成员

我刚刚进入快速编码,我正在尝试按照教程.但似乎我所关注的编码器可能有旧版本,或者我做错了什么.我正在尝试制作一个声音对象来制作音板.但是当我尝试使用append将声音文件添加到数组时,它表示该方法append不是该成员NSArray.谁能告诉我解决这个问题的正确方法是什么?!] 1

在此输入图像描述

objective-c nsarray ios swift

9
推荐指数
2
解决办法
2万
查看次数

本地化本机开发区域,基本本地化和Appstore语言(包)

我确实理解"本地化本地开发区域"是项目中缺少的语言的后备.

我知道Appstore中显示的语言来自bundle及其目录结构,但是如何使基本本地化与开发区域相匹配?


在Xcode 6上,默认设置为英语,用于开发语言,并在info.plist中检查基本本地化.

我已经阅读了建议的问题和答案,但我仍然没有一个明确的答案.

该项目的目录结构只有一个名为Base.lproj的目录,如果我更改info.plist本地化本地开发区域不会影响项目被识别为具有英语开发语言的事实.

如果我根据info.plist中的新值添加本地化,​​删除基本本地化,删除英文本地化(移动到垃圾不留痕迹),重新选择基本本地化,说基本本地化指的是说西班牙语作为参考语言,捆绑仍然被认为是英语.

如何设置基础国际化以匹配除英语之外的其他语言?

xcode localization objective-c ios

8
推荐指数
1
解决办法
5206
查看次数