小编JEL*_*JEL的帖子

UIStackView - 隐藏堆栈视图时的布局约束问题

我的应用有2个屏幕:

  1. TableViewVC(这里没有堆栈视图)

  2. DetailVC(此处所有嵌套堆栈视图;请参见图片链接:嵌套StackViews图片) - 注意,这些堆栈视图中有标签和图像.

当您按下tableview中的单元格时,它会将信息从TableViewVC传递到DetailVC.问题是隐藏DetailVC中的特定UIStackViews.我只想在视图加载时隐藏DetailVC中各个窗口中的2个堆栈视图.所以我在DetailVC中编写这段代码来完成这个:

override func viewDidLoad() {
    super.viewDidLoad()

    self.nameLabel.text = "John"

    self.summaryStackView.hidden = true
    self.combinedStackView.hidden = true
}
Run Code Online (Sandbox Code Playgroud)

一切看起来都很棒,但Xcode只在运行时发出许多警告.应用程序未运行时,Storyboard中没有警告.请参阅错误图片的链接:错误图片

基本上它是很多UISV隐藏,UISV间距,UISV-canvas连接错误.如果我隐藏相同的堆栈视图,这些错误就会消失,viewDidAppear但是有一些闪存的东西应该被隐藏然后隐藏起来.用户简要地看到视图然后隐藏哪个不好.

很抱歉,由于无法实际发布图片而非链接,仍然无法发布.

对于如何解决这个问题,有任何的建议吗?这是一个我真正想要推出到应用程序商店的应用程序 - 这是我的第一个,所以任何帮助都会很棒!

编辑/更新1:

我找到了一个小代码,我把这个代码放在名为DetailVC的第二个屏幕中:

// Function I use to delay hiding of views
func delay(delay: Double, closure: ()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

// Hide the 2 stack views after 0.0001 seconds of screen loading
override func awakeFromNib() …
Run Code Online (Sandbox Code Playgroud)

ios swift uistackview

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

播放/暂停和已用时间未在iOS命令中心正确更新

我有一个可以从iOS命令中心和锁定屏幕播放的视频播放器.当我在我的应用程序切换播放/暂停按钮,它应该更新指挥中心(播放/暂停按钮,MPRemoteCommandCenter通过更新)nowPlayingInfo(MPNowPlayingInfoCenter).我不确定为什么它没有更新.

例如,如果我在我的应用程序中使用自定义按钮暂停视频,则命令中心仍会显示暂停按钮(意味着视频仍在播放,这是错误的.)

在此输入图像描述

这是我更新的方式nowPlayingInfo:

func updateMPNowPlayingInforCenterMetadata() {
    guard video != nil else {
        nowPlayingInfoCenter.nowPlayingInfo = nil
        return
    }

    var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()

    let image: UIImage
    if let placeholderLocalURL = video.placeholderLocalURL, let placeholderImage = UIImage(contentsOfFile: placeholderLocalURL.path) {
        image = placeholderImage
    } else {
        image = UIImage()
    }

    let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { _ -> UIImage in
        return image
    })

    nowPlayingInfo[MPMediaItemPropertyTitle] = video.title
    nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = video.creator?.name ?? " "
    nowPlayingInfo[MPMediaItemPropertyArtwork] …
Run Code Online (Sandbox Code Playgroud)

objective-c mpmediaitem ios mpnowplayinginfocenter swift

13
推荐指数
1
解决办法
2674
查看次数

检查AVFoundation何时可以获得资源

我正在使用AVFoundation和创建AVPlayer但是会出现一些错误,如下所示.

这些是2个错误:

2017-01-06 15:51:19.974693 DemoApp [11855:3855225]视频播放器状态失败:播放器项错误=错误域= AVFoundationErrorDomain代码= -11839"无法解码"UserInfo = {NSUnderlyingError = 0x174253ef0 {错误域= NSOSStatusErrorDomain代码= -12913"(null)"},NSLocalizedFailureReason =此媒体所需的解码器正忙.,NSLocalizedRecoverySuggestion =停止解码媒体的任何其他操作,然后重试.,NSLocalizedDescription =无法解码}

2017-01-06 15:51:19.974783 DemoApp [11855:3855225]视频播放器状态失败:播放器错误=(null)

我可以像这样打印这两个错误:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    ///.. other code ..///

      case AVPlayerItemStatusFailed: {
        print("Video player Status Failed: player item error = \(self.player.currentItem.error)")
        print("Video player Status Failed: player error = \(self.player.error)")
    } 
}
Run Code Online (Sandbox Code Playgroud)

Apple针对此错误的文档:

似乎苹果AVPlayer对整个系统可以创造的数量有限制; …

avfoundation ios avplayer swift avplayeritem

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

允许同时创建多少个AVPlayers?

我有一个collectionView,每个cell都有一个AVPlayer可以玩的.所以每个小区都在播放视频.iOS似乎只允许您同时播放16个视频.例如,请查看下面的示例应用.在50个中cells,只有16个开始播放视频.这个数字总是保持不变.这种情况发生在运行iOS 10的iPhone 6上.在Xcode模拟器中,所有50个视频都开始播放.此问题仅发生在实际设备上.

在此输入图像描述

另外,当我打印出来时,我得到了这两个错误:

print("Video player Status Failed: player item error =  (self.player.currentItem.error)")
print("Video player Status Failed: player error = \(self.player.error)")
Run Code Online (Sandbox Code Playgroud)

2016-11-07 15:53:46.548288 SampleApp [1810:515089]视频播放器状态失败:播放器项错误=错误域= AVFoundationErrorDomain代码= -11839"无法解码"UserInfo = {NSUnderlyingError = 0x1704414d0 {错误域= NSOSStatusErrorDomain代码= -12913"(null)"},NSLocalizedFailureReason =此媒体所需的解码器正忙.,NSLocalizedRecoverySuggestion =停止解码媒体的任何其他操作,然后重试.,NSLocalizedDescription =无法解码} 2016-11-07 15:53:46.548358 SampleApp [1810:515089]视频播放器状态失败:播放器错误=(null)

AVPlayer您有多少人可以拥有或我做错了什么?

谢谢!

objective-c avfoundation ios avplayer swift

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

从Realm中的List中删除对象 - Swift

我有一个集合视图,您可以在其中选择要删除的多个单元格.这意味着如果删除多个单元格,则还应在Realm中删除多个对象 - 每个单元格1个对象.

我有一个函数,它接受一个数组,这些数组Int将从集合视图的选定indexPaths中填充.

问题是我不知道如何做到这两点
1)删除Realm中的对象和
2)拥有List最新的没有删除的对象

我的代码是:

我像这样得到索引路径:

let indexPaths = collectionView.indexPathsForSelectedItems

这是我接受indexPaths,更新List和删除Realm中对象的函数.它目前无法正常工作,因为没有删除对象.我注意到removeAll没有删除任何东西.

func removeVideos(at indexes: [Int]) {
        let newVideos = List<Video>()
        for (index, video) in favorite!.videos.enumerated() {
            if !indexes.contains(index) {
                newVideos.append(video)
            }
        }

        let realm = try! Realm()
        try! realm.write {
            favorite!.videos.removeAll()

            newVideos.forEach { newVideo in
                favorite!.videos.append(newVideo)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我这样调用这个函数:

removeVideos(at: indexPaths.map { $0.item })

有什么想法吗?

realm ios uicollectionview swift realm-list

6
推荐指数
1
解决办法
9996
查看次数

获取UIBezierPath的起点

我创建了一个UIBezierPath,但我不知道如何访问它的起点.我试过这样做:

let startPoint = path.currentPoint
Run Code Online (Sandbox Code Playgroud)

该属性currentPoint给了我最后一点,而不是起点.我需要起点的原因是因为我想在路径的起点放置一个图像.

有任何想法吗?

core-graphics ios uibezierpath swift

4
推荐指数
1
解决办法
2869
查看次数

AVPlayer 在缓冲时显示和隐藏加载指示器

(注意:我正在运行 iOS 9 并且正在执行 HTTP 实时流媒体)

我有一个AVPlayer并且想在播放器缓冲时显示加载指示器。当玩家开始以慢速连接玩游戏时,KVO 会被调用以获取以下属性: isPlaybackBufferEmpty

isPlaybackLikelyToKeepUp

isPlaybackBufferFull

问题是缓冲完成后不会再次调用这些相同的属性(当我说完成时,我的意思是视频可以再次播放。)我的目标是在正确的时间隐藏加载指示器,但这些不会再次被召唤。

我在网上搜索并找到了这个雷达:http : //www.openradar.me/25931165 不确定它是否 100% 相关

有什么想法吗?

// MARK: - Key-Value Observing Method

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == #keyPath(AVPlayerItem.status) {

        switch playerItem.status {
        case .unknown:
            break

        case .readyToPlay:
            player.play()

        case .failed:
            postPlaybackDidFailWithErrorNotification(error: error)
        }
    }
    else if keyPath == #keyPath(AVPlayer.currentItem.isPlaybackBufferEmpty) {
        guard let currentItem = player.currentItem else {
            return
        }

        if currentItem.isPlaybackBufferEmpty …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avplayer swift

4
推荐指数
2
解决办法
6644
查看次数

更改默认 StackView 动画

如果解释不够好,请原谅我。基本上,下面的视频显示了在堆栈视图中隐藏标签的标准动画。请注意,它看起来像标签“滑动”和“折叠在一起”。

我仍然想隐藏标签,但想要一个 Alpha 变化但标签不“滑动”的动画。相反,标签会更改 Alpha 并保持在原位。这可以通过堆栈视图实现吗?

这是我必须设置动画的代码:

    UIView.animate(withDuration: 0.5) {
      if self.isExpanded {
        self.topLabel.alpha = 1.0
        self.bottomLabel.alpha = 1.0
        self.topLabel.isHidden = false
        self.bottomLabel.isHidden = false
      } else {
        self.topLabel.alpha = 0.0
        self.bottomLabel.alpha = 0.0
        self.topLabel.isHidden = true
        self.bottomLabel.isHidden = true
      }
    } 
Run Code Online (Sandbox Code Playgroud)

动画片

更新1

看来即使没有堆栈视图,如果我对高度约束进行动画处理,您也会得到这种“挤压”效果。例子:

    UIView.animate(withDuration: 3.0) {
      self.heightConstraint.constant = 20
      self.view.layoutIfNeeded()
    }
Run Code Online (Sandbox Code Playgroud)

uiview uiviewanimation ios swift uistackview

4
推荐指数
1
解决办法
2616
查看次数

Swift - 通用函数参数

我正在尝试这样做:

protocol Fly {
}

class Bird: Fly {
}

func fetch<T: Fly>(model: T) {
    print("Done")
}

let bird: Fly = Bird()
fetch(model: bird)
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

无法使用类型为“(模型:Fly)”的参数列表调用“获取”

我设置let bird: Fly = Bird()为 type Fly,它不应该工作,因为该函数fetch采用任何符合该协议的对象吗?

有什么想法吗?

generics xcode swift swift-protocols

3
推荐指数
1
解决办法
2646
查看次数

在UITableViewCell中下载和缓存图像

注意:请没有库。这对我来说很重要。另外,对此有各种各样的答案,但我发现没有一个能很好地解决该问题。请不要将其标记为重复项。提前致谢!

我的问题是,如果您在表中快速滚动,就会看到旧图像并闪烁。

  • 我所读问题的解决方案是取消URLSession 数据请求。但是我不知道如何在正确的时间和地点做到这一点。可能还有其他解决方案,但不确定。

这是我到目前为止的内容:

图像缓存类

class Cache {

    static let shared = Cache()

    private let cache = NSCache<NSString, UIImage>()
    var task = URLSessionDataTask()
    var session = URLSession.shared

    func imageFor(url: URL, completionHandler: @escaping (image: Image? error: Error?) -> Void) {
            if let imageInCache = self.cache.object(forKey: url.absoluteString as NSString)  {
                completionHandler(image: imageInCache, error: nil)
                return
            }

            self.task = self.session.dataTask(with: url) { data, response, error in

                if let error = error {
                    completionHandler(image: nil, error: Error)
                    return
                }

                let image = …
Run Code Online (Sandbox Code Playgroud)

uitableview ios nscache swift

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