小编iur*_*iur的帖子

iOS11中奇怪的uitableview行为.单元格向上滚动导航推送动画

我最近将一些代码迁移到了新的iOS 11 beta 5 SDK.

我现在从UITableView得到一个非常令人困惑的行为.tableview本身并不那么花哨.我有自定义单元格但在大多数情况下它只是为了它们的高度.

当我用tableview推动我的视图控制器时,我得到一个额外的动画,其中单元格"向上滚动"(或者可能整个桌面框架被更改)并沿着推/弹导航动画向下移动.请看gif:

波浪的tableview

我手动创建tableviewloadView方法和设置自动布局约束等于前置,顶部的tableview的上海华盈的底部.superview是视图控制器的根视图.

视图控制器推送代码非常标准: self.navigationController?.pushViewController(notifVC, animated: true)

相同的代码在iOS 10上提供正常行为.

能指点我指出错误的方向吗?

编辑:我已经制作了一个非常简单的tableview控制器,我可以在那里重现相同的行为.码:

class VerySimpleTableViewController : UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        cell.textLabel?.text = String(indexPath.row) …
Run Code Online (Sandbox Code Playgroud)

animation uitableview uinavigationcontroller ios

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

NSKeyValueObservation:无法从对象中删除关键路径的观察者,因为它未注册为观察者

我在我的应用程序中遇到随机崩溃(我无法在我拥有的设备上重现),例外情况:

无法从AVPlayerLayer 0xaddress中删除关键路径"readyForDisplay"的观察者Foundation.NSKeyValueObservation 0xaddress,因为它未注册为观察者.

当我释放包含AVPlayerLayer的UIView时会发生这种情况.

我的初学者:

private var playerLayer : AVPlayerLayer { return self.layer as! AVPlayerLayer }

init(withURL url : URL) {
    ...
    self.asset = AVURLAsset(url: url)
    self.playerItem = AVPlayerItem(asset: self.asset)
    self.avPlayer = AVPlayer(playerItem: self.playerItem)
    super.init(frame: .zero)
    ...
    let avPlayerLayerIsReadyForDisplayObs = self.playerLayer.observe(\AVPlayerLayer.isReadyForDisplay, options: [.new]) { [weak self] (plLayer, change) in ... }
    self.kvoPlayerObservers = [..., avPlayerLayerIsReadyForDisplayObs, ...]
    ...
    }
Run Code Online (Sandbox Code Playgroud)

我的deinit抛出异常:

deinit {
    self.kvoPlayerObservers.forEach { $0.invalidate() }
    ...
    NotificationCenter.default.removeObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

根据Crashlytics的说法,它发生在不同iPhone上的iOS 11.4.1上.

导致的代码deinit非常简单:

// Some UIViewController context.
self.viewWithAVLayer?.removeFromSuperview()
self.viewWithAVLayer …
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios avplayerlayer swift

14
推荐指数
1
解决办法
1464
查看次数

迅速.unowned只能应用于类和类绑定协议类型.弱者工作得很好

请将问题读到最后,因为它似乎是许多类似其他人的副本,但事实并非如此.大多数其他问题使用带let关键字的闭包来捕获对象init之前的弱或无主自我.我不.

我的代码:

class Singleton : ObserverProtocol {

    static let shared = Singleton()

    private let obs : Observer = Observer.init()

    private init() { self.obs.responder = self }

    func observe(_ object : Any) {}

    fileprivate class Observer : NSObject {
        unowned var responder : ObserverProtocol!
        func observe(_ obj : Any) {
            self.responder.observe(obj)
        }
    }
}

fileprivate protocol ObserverProtocol : class {
    func observe(_ object : Any)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我会突出显示错误 unowned var responder : ObserverProtocol!

'unowned'可能只适用于类和类绑定协议类型,而不是'ObserverProtocol!'

如果我unowned改为weak我可以编译.

显然有一些 …

swift swift-protocols unowned-references

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

IOS。多元化。Stringdict 格式包含 2 个 int 参数

我的问题类似于如何在 swift ios 中将常规字符串占位符添加到翻译的复数 .stringdict 中,但我试图了解是否可以将 2 个 int 参数传递给字符串 dict。

假设我想翻译以下内容:

1 apple : 3 pears
2 apples : 1 pear
Run Code Online (Sandbox Code Playgroud)

是否可以在一种本地化格式字符串中执行此操作,例如:

let apples = 1
let pears = 3
let applesAndPears = String.localizedStringWithFormat(<format>, apples, pears)
print(applesAndPears)
Run Code Online (Sandbox Code Playgroud)

还是我必须将它们分开组合?

translation plural ios swift

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

当按下按钮时 UIAlertController 被关闭时收到通知

我想在任何 UIAlertController 由于用户点击警报按钮之一而自行关闭(动画完成)之前和之后执行一些操作并呈现一些 UI。

我怎样才能收到用户按下 UIAlertController 中的某个按钮并且它将被解雇然后又被解雇的通知?

在文档中,建议不要子类化 UIAlertController。我仍然尝试过子类化,认为也许它内部会调用func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)自己。类似的self.dismiss(...,不过iOS10上好像不是这样。

我还尝试将“手动”解雇添加到 UIAlertAction 处理程序中:

let alert = UIAlertController.init(...
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
    alert.dismiss(animated: true, completion: { 
        print("Dismissed")
    })
})
alert.addAction(defaultAction)
Run Code Online (Sandbox Code Playgroud)

但似乎警报在按下按钮后但在调用处理程序之前被解除。无论如何它也不太好用。即使它有效,记住将我的代码添加到每个 UIAlertAction 处理程序中也会有点麻烦。

我将不胜感激任何想法。

uiviewcontroller ios uialertcontroller

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

UIButton 中的 UIBezierPath 圆角

我想在文本周围绘制一个可点击的气泡形状。为了做到这一点,我决定向 UIButton 添加一个 shapelayer,如下所示:

// Button also has this
bubbleButton.contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
bubbleButton.setTitle("Gutp", for: .normal)

// In my subclass of UIButton
override func layoutSubviews() {
    super.layoutSubviews()

    self.bubbleLayer?.removeFromSuperlayer()

    let maskLayer = CAShapeLayer.init()
    let bezierPath = UIBezierPath.init(roundedRect: self.bounds,
                                       byRoundingCorners: [.topRight, .topLeft, .bottomLeft],
                                       cornerRadii: CGSize(width: 20, height: 20))
    maskLayer.path = bezierPath.cgPath
    maskLayer.strokeColor = UIColor.red.cgColor
    maskLayer.lineWidth = 2
    maskLayer.fillColor = UIColor.clear.cgColor
    maskLayer.backgroundColor = UIColor.clear.cgColor
    maskLayer.isOpaque = false

    self.bubbleLayer = maskLayer

    if let layers = self.layer.sublayers {
        self.layer.insertSublayer(self.bubbleLayer!, …
Run Code Online (Sandbox Code Playgroud)

uibutton ios uibezierpath swift

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