小编Hon*_*ney的帖子

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万
查看次数

如果用户强行退出,iOS会将我的应用程序启动到后台吗?

我通过content-available在推送通知上使用标志来触发后台获取.我有fetchremote-notification UIBackgroundModes启用.

这是我在AppDelegate.m中使用的实现:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}
Run Code Online (Sandbox Code Playgroud)

当应用程序在后台运行时,它可以正常工作.(收到通知,应用程序触发"看起来像我收到通知"本地通知,因为上面的代码应该这样做).

但是,当应用程序未运行并且收到带有content-available标志的推送通知时,应用程序不会启动,并且didRecieveRemoteNotification永远不会调用委托方法.

WWDC视频最新的多任务处理(来自WWDC 2013的#204)显示了这一点:在此输入图像描述

它表示当收到带有content-available标志的推送通知时,应用程序将"启动到后台" .

为什么我的应用程序没有启动到后台?

所以真正的问题是:

用户强行退出应用后,iOS会执行后台任务吗?

push-notification apple-push-notifications ios ios7

217
推荐指数
4
解决办法
12万
查看次数

如果我撤销现有的分发证书,是否会破坏现有应用程序的任何内容?

我为已经在商店上有应用程序的组织构建了一个iOS应用程序.经过数周试图找到有钥匙签署应用程序的人,他们终于回来说:"干脆完成!".所以我想知道如何继续.如果我进入配置门户,并撤销dist证书,然后重新分配一个,我是否能够签署该应用程序并上传它没有问题?

这就是我要做的,但我不知道现有应用程序的后果.它会搞砸了吗?然后,当组织想要继续更新他们的应用程序时,他们不能只是撤销,然后再次将证书重新分配给他们吗?

这部分过程对我来说有点模糊,所以稍微澄清一下吧!

distribution certificate app-store apple-developer ios-app-signing

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

HTTP状态代码200(缓存)与状态代码304之间有什么区别?

我正在使用谷歌的"Page Speed"插件来访问我的网站.

我页面上的一些组件表示为HTTP状态:

200 200(缓存)304

通过谷歌的"页面速度".

我困惑的是200(缓存)和304之间的区别.

我已多次刷新页面(但尚未清除我的缓存),似乎我的favicon.ico和一些图像状态= 200(缓存),而其他一些图像是http状态304.

我不明白为什么不同.

更新:

使用Google"Page Speed",我收到了http://example.com/favicon.ico的"200(缓存)" 以及http://cdn.example.com/js/ga.js

但是,我收到http://cdn.example.com/js/combined.min.js的http状态"304"

我不明白为什么我有两个JavaScript文件位于同一目录/ js /中,一个返回http状态304,另一个返回200(缓存)状态代码.

caching http cache-control httpwebrequest http-status-codes

194
推荐指数
4
解决办法
16万
查看次数

什么是Swift等效的respondsToSelector?

我用谷歌搜索,但无法找出快速等同于什么respondsToSelector:.

这是我唯一能找到的东西(Swift替代respondsToSelector :)但在我的情况下并不太重要,因为它检查委托的存在,我没有委托我只想检查是否存在新的API或者不在设备上运行时,如果没有回到以前版本的api.

objective-c selector swift

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

Swift语言中的错误处理

我没有读过太多关于Swift的信息,但我注意到的一件事是没有例外.那么他们如何在Swift中进行错误处理呢?有没有人发现任何与错误处理相关的内容?

error-handling swift

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

UIlabel layer.cornerRadius在iOS 7.1中不起作用

我目前正在寻找具有属性的UILabel addMessageLabel.layer.cornerRadius = 5.0f;在安装了iOS 7.0的设备上,它有圆角.在安装了iOS 7.1的设备上,它没有圆角.

这只是iOS 7.1的一个错误吗?

cornerradius uiview uilabel ios ios7

181
推荐指数
4
解决办法
7万
查看次数

物业获取者和二传手

有了这个简单的类,我得到编译器警告

试图x在自己的setter/getter中修改/访问

当我像这样使用它时:

var p: point = Point()
p.x = 12
Run Code Online (Sandbox Code Playgroud)

我得到一个EXC_BAD_ACCESS.如果没有明确支持ivars,我怎么能这样做?

class Point {

    var x: Int {
        set {
            x = newValue * 2 //Error
        }
        get {
            return x / 2 //Error
        }
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

properties compiler-warnings getter-setter swift

179
推荐指数
8
解决办法
23万
查看次数

有没有办法检查iOS应用程序是否在后台?

我想检查应用程序是否在后台运行.

在:

locationManagerDidUpdateLocation {
    if(app is runing in background){
        do this
    }
}
Run Code Online (Sandbox Code Playgroud)

objective-c uiapplicationdelegate application-lifecycle ios ios-background-mode

177
推荐指数
6
解决办法
8万
查看次数

如何在Swift中提供具有错误类型的本地化描述?

我正在使用Swift 3语法定义自定义错误类型,我想提供一个用户友好的错误描述,该描述由对象的localizedDescription属性返回Error.我该怎么做?

public enum MyError: Error {
  case customError

  var localizedDescription: String {
    switch self {
    case .customError:
      return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
    }
  }
}

let error: Error = MyError.customError
error.localizedDescription
// "The operation couldn’t be completed. (MyError error 0.)"
Run Code Online (Sandbox Code Playgroud)

有没有办法让localizedDescription我返回我的自定义错误描述("用户友好的错误描述.")?请注意,此处的错误对象是类型Error而不是MyError.当然,我可以将对象强制转换为MyError

(error as? MyError)?.localizedDescription
Run Code Online (Sandbox Code Playgroud)

但是有没有办法让它工作而不会转换为我的错误类型?

error-handling nslocalizedstring swift swift3

175
推荐指数
4
解决办法
4万
查看次数