我的应用有2个屏幕:
TableViewVC(这里没有堆栈视图)
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命令中心和锁定屏幕播放的视频播放器.当我在我的应用程序切换播放/暂停按钮,它应该更新指挥中心(播放/暂停按钮,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) 我正在使用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针对此错误的文档:
case decoderTemporarilyUnavailable = -11839似乎苹果AVPlayer对整个系统可以创造的数量有限制; …
我有一个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您有多少人可以拥有或我做错了什么?
谢谢!
我有一个集合视图,您可以在其中选择要删除的多个单元格.这意味着如果删除多个单元格,则还应在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 })
有什么想法吗?
我创建了一个UIBezierPath,但我不知道如何访问它的起点.我试过这样做:
let startPoint = path.currentPoint
Run Code Online (Sandbox Code Playgroud)
该属性currentPoint给了我最后一点,而不是起点.我需要起点的原因是因为我想在路径的起点放置一个图像.
有任何想法吗?
(注意:我正在运行 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) 如果解释不够好,请原谅我。基本上,下面的视频显示了在堆栈视图中隐藏标签的标准动画。请注意,它看起来像标签“滑动”和“折叠在一起”。
我仍然想隐藏标签,但想要一个 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)
看来即使没有堆栈视图,如果我对高度约束进行动画处理,您也会得到这种“挤压”效果。例子:
UIView.animate(withDuration: 3.0) {
self.heightConstraint.constant = 20
self.view.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试这样做:
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采用任何符合该协议的对象吗?
有什么想法吗?
注意:请没有库。这对我来说很重要。另外,对此有各种各样的答案,但我发现没有一个能很好地解决该问题。请不要将其标记为重复项。提前致谢!
我的问题是,如果您在表中快速滚动,就会看到旧图像并闪烁。
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) swift ×10
ios ×9
avfoundation ×3
avplayer ×3
objective-c ×2
uistackview ×2
avplayeritem ×1
generics ×1
mpmediaitem ×1
nscache ×1
realm ×1
realm-list ×1
uibezierpath ×1
uitableview ×1
uiview ×1
xcode ×1