小编Goo*_*rel的帖子

什么是'UIView-Encapsulated-Layout-Width'约束?

我一直得到'无法同时满足约束'的例外(Xcode 5,iOS 7,设备和模拟器),其中列表中的一个约束是这样的:

"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"
Run Code Online (Sandbox Code Playgroud)

我自己没有设置这个约束.它也不是NSAutoresizingMaskLayoutConstraint.但是它来自哪里?我怎么能摆脱它呢?

我不知道.我'UIView-Encapsulated-Layout-Width'在Apple的文档中找不到任何相关内容.即便是谷歌搜索也没有任何回报.

有什么建议?

PS:我在UICollectionView一个自定义子类中使用这个单元格UICollectionViewFlowLayout.也许这'Encapsulated-Layout'部分与此有关?

ios autolayout uicollectionview nslayoutconstraint uicollectionviewlayout

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

滚动/缩放时是否可以连续跟踪MKMapView区域?

当用户在地图上放大或滚动时,我想连续更新我的UI,根据MKMapView.(不仅在滚动结束后,工作正常.)

我尝试了委托方法mapView:regionWillChangeAnimated:根据文档,"只要当前显示的地图区域发生变化就会调用.在滚动期间,可以多次调用此方法来报告地图位置的更新." http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [self updateUIAcordingToMapViewRegionChange];
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这不起作用,因为文档似乎没有说实话.该方法仅在区域变化的最开始时调用一次.在滚动期间,当手指向下并四处移动时,永远不会再次调用该方法.

我能找到的关于这个问题的唯一帖子是由macrumors成员namanhams:http://forums.macrumors.com/showthread.php?t = 1225172 但是没有人想出任何想法......

作为一种解决方法,我尝试在regionWillChange中设置一个计时器(并在regionDidChange中使其无效):

- (void)handleRegionChange:(NSTimer*)timer
{
   [self updateUIAcordingToMapViewRegionChange];
} 

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                    target:self
                                                  selector:@selector(handleRegionChange:)
                                                  userInfo:nil
                                                   repeats:YES];
}
Run Code Online (Sandbox Code Playgroud)

但这也行不通.来自计时器的所有方法调用都在滚动结束后立即执行.似乎滚动mapView阻止主线程或其他东西......

我也在stackoverflow上阅读了这篇文章,但遗憾的是并没有完全理解它: 监视MKMapView重绘事件 所以如果我的问题的解决方案确实存在于那个SO线程中,请告诉我,我试着深入研究它的细节.

我仍然希望我只是太愚蠢或太盲目无法找到正确的委托方法,并且非常感谢处理MKMapView区域跟踪的任何提示,变通方法和最佳实践.

谢谢!

mapkit mkmapview ios

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

更改部署目标后,无法再将app模块导入单元测试

为了在我的swift单元测试中对我的主应用程序目标的公共类进行单元测试,我必须在我的测试中导入我的主应用程序模块,如下所示:

#import MyAppModuleName

这工作得很好,直到我将部署目标从7.0更改为8.4.

现在构建和运行我的应用程序仍然完美,但运行单元测试停止工作.编译器抱怨上面的import语句:Swift Compiler Error: Module file's minimum deployment target is iOS8.4 v8.4

我不知道为什么.我忘记在其他地方更改部署目标了吗?

我的工作区(Xcode 6.4.)包含我自己的项目和一个Pods项目(由cocoapods自动创建).我在我的应用程序和测试中使用了Swift和Objective-C.

这是我更详细的做法:

1)为我的项目,我的主要目标,以及Pods我工作区中的项目以及所有pod目标,将部署目标从7.0更改为8.4 .

在此输入图像描述在此输入图像描述在此输入图像描述在此输入图像描述

2)清理构建文件夹(Shift + Alt + Cmd + K)并重新启动Xcode.

3)Cmd + U - >错误

将主应用程序的部署目标更改回7.0时,一切正常.

这个问题来自哪里?

xcode unit-testing build-settings ios swift

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

Swift 3.0:在Array或Dictionary扩展中调用global func min <T>(T,T)时出现编译器错误

从Swift 2.2转换为3.0后,我的Array扩展不再编译,因为它包含对全局标准库函数的调用min<T>(T,T)并显示编译器错误extra argument in call.

这是重现错误的简单方法:

extension Array {
    func smallestInt(first: Int, second: Int) -> Int {
        return min(first, second) // compiler error: "Extra argument in call"
    }
}
Run Code Online (Sandbox Code Playgroud)

将相同的函数添加到扩展名时Dictionary,我得到相同的错误,而完全相同的代码在其他类型的扩展中编译得很好(例如StringAudioBuffer):

数组和字典扩展中的编译器错误

看着的文件ArrayDictionary,我发现有关于实例方法Sequence命名public func min() -> Element?public func min(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?.虽然两者StringAudioBuffer没有任何形式的min(...)功能.

这可能是我无法调用全局函数的原因吗?编译器无法区分全局func min<T>(T,T),self.min(...)尽管它们具有完全不同的签名? …

arrays swift swift-extensions swift3

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

在Objective-C中覆盖延迟加载的属性getter

我通常懒惰地在他们的getter方法中实例化我的@property对象,如下所示:

@interface MyGenericClass : UIViewController
@property(nonatomic, readonly) UIImageView *infoImageView
// ...

@implementation GenericClass

- (UIImageView *)infoImageView
{
    if (!_infoImageView) {
        _infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];
    }
    return _infoImageView;
}
Run Code Online (Sandbox Code Playgroud)

但是当子类化时,我经常想要覆盖一些@properties以使其更具子类.所以我想改变实例化并执行以下操作:

@interface MySpecificSubclass : MyGenericClass
//...

@implementation MySpecificSubclass

- (UIImageView *)infoImageView
{
    if (!_infoImageView) {
        _infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];
    }
    return _infoImageView;
}
Run Code Online (Sandbox Code Playgroud)

但那是不可能的,因为子类无法访问_infoImageView iVar.

我正在努力做坏事吗?或者有一个共同的解决方案/最佳实践吗?我看到的唯一解决方案是让iVar公开,这感觉违反了封装原则......

感觉这是一个非常基本的问题,那里必须有数百万的答案,但是在搜索了几个小时之后,我发现的一切都是Objective-C:当覆盖超类getter并尝试访问ivar时编译错误 ,但是它没有解决方案.

overriding lazy-loading properties objective-c lazy-initialization

7
推荐指数
1
解决办法
9225
查看次数

AVAssetTrack 的 Asset 属性有时为零

我试图assetAVAssetTrack对象中获取属性,但nil有时会这样。看来这个问题是我使用后才出现的Dispatch.main.async

根据文档,有必要使用loadValuesAsynchronously(forKeys:, completion:)以避免阻塞主线程,并在加载完成后返回主线程。

let asset = AVURLAsset(url: videoInAppBundleURL)
let track = asset.tracks(withMediaType: .video).first!
assert(track.asset != nil) // passes
track.loadValuesAsynchronously(forKeys: [#keyPath(AVAssetTrack.asset)]) {
    assert(track.asset != nil) // passes
    DispatchQueue.main.async {
        assert(track.asset != nil) // FAILS
        // [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现的是:

  • 无论我是在设备上还是在模拟器上运行都没有区别。
  • 看来不是video/videoURL的问题。该视频是主包的一部分,我尝试了 .mp4 和 .mov 文件,并通过 AVPlayerViewController 显示视频来确保视频正常工作。

这是一个工作演示项目

我还想知道:为什么AVAssetTrackasset属性是可选的?(所有!!其他属性都是非可选的)

注意:在阅读马特的有用评论和进一步调查后,这个问题已被编辑。

asynchronous avfoundation ios avasset

5
推荐指数
1
解决办法
1588
查看次数