iOS13 适配总结

2019-10-16  本文已影响0人  司徒新新

更改Placehoder颜色

该私有key禁止访问了

textField.setValue(color, forKeyPath: "_placeholderLabel.textColor")
searchBar.value(forKey: "_searchField")
//替换为
textField.attributedPlaceholder = NSAttributedString.init(string: self.placeholder ?? "", attributes: [NSAttributedString.Key.foregroundColor : UIColor.red])
searchBar.value(forKey: "searchField") as! UITextField

presentViewController样式变化

在使用 presentViewController 来跳转视图时系统提供了两个参数来简化跳转的设置,modalTransitionStyle 和 modalPresentationStyle。前者为转场过渡的类型,后者为展示的样式,系统为两者都提供了多种可选样式。

展示的方式变了就看 modalPresentationStyle 的值,在iOS13前,该值默认为0,即 .fullScreen。而此时,在 iOS13 中变为了-2。

在 iOS13 中 modalPresentationStyle 的类型新增了以下类型:

UIModalPresentationAutomatic = -2

修改方法

let vc = UIViewController()     // vc即需要被present的viewcontroller
vc.modalPresentationStyle = .custom
self.present(vc, animated: true, completion: nil)

夜间模式 Dark/Light

一般我们之前都是默认的,现在系统出了一个夜间模式,将以前的白色都变成了黑色,与我们UI设计不一样,因此我是采取的禁用了dark的模式.

我分别在我的BaseViewController和BaseTabBarViewController的 viewDidLoad方法里写了下面的代码.

if #available(iOS 13.0, *) { 
     overrideUserInterfaceStyle = .light
} else {
     // Fallback on earlier versions
}

或者在info.plist设置,对应的Value为Light/Dark


image.png

TabBar红点位置偏移

如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决办法是修改为通过UITabBarButton的位置来设置红点的frame

黑线处理

public func clearBlack() {
     self.view.subviews.last?.subviews.forEach({ (view) in
            if view.isKind(of: NSClassFromString("UISearchBarBackground")!) {
                view.backgroundColor = UIColor.white
                view.layer.contents = nil
                return
            }
     })
}

UISegmentedControl问题

UISegmentedControl样式变化了,之前写好的


image.png

变成了这样


image.png

只需要添加这些代码就可以了


extension UISegmentedControl{
    public func segmentStyle(){
        if#available(iOS 13, *) {
            let tintColorImage = UIColor.white.toImage(size: CGSize.init(width:self.frame.size.width, height:self.frame.size.height))
            
            let dividerColorImage = UIColor.white.toImage(size: CGSize.init(width:1, height:self.frame.size.height))
          
            setBackgroundImage(UIColor.white.toImage(size: CGSize.init(width:self.frame.size.width, height:self.frame.size.height)), for: .normal, barMetrics: .default)
         
            setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
            
            setBackgroundImage(tintColorImage, for: .highlighted, barMetrics: .default)
            
            setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
            
            setDividerImage(dividerColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
            
            setDividerImage(dividerColorImage, forLeftSegmentState: .selected, rightSegmentState: .selected, barMetrics: .default)
            
            self.apportionsSegmentWidthsByContent = true
            
            layer.borderColor = UIColor.white.cgColor
            
            layer.borderWidth = 0
        } else {
            let dividerImage = UIColor.white.toImage(size: CGSize.init(width:1, height:self.frame.size.height))
            tintColor = UIColor.clear
            setDividerImage(dividerImage, forLeftSegmentState: .normal, rightSegmentState: .selected, barMetrics: .default)
            setDividerImage(dividerImage, forLeftSegmentState: .selected, rightSegmentState: .normal, barMetrics: .default)
            setDividerImage(dividerImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
        }
    }
}



extension UIColor {
    public func toImage(size:CGSize) -> UIImage?{
        var resultImage : UIImage? = nil
        let rect = CGRect(x:0, y:0, width: size.width, height: size.height)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.main.scale)
        guard let context = UIGraphicsGetCurrentContext() else {
            return resultImage
        }

        context.setFillColor(self.cgColor)
        context.fill(rect)
        resultImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return resultImage
    }
    
}

segment.segmentStyle() //使用的时候直接segment.segmentStyle()调用就可以考虑

WebView废弃

查看API可以看到:iOS 2.0 到 iOS 11.0
在12.0就已经被废弃,部分APP使用webview时, 审核被拒

@available(iOS, introduced: 2.0, deprecated: 12.0, message: "No longer supported; please adopt WKWebView.")
open class UIWebView : UIView, NSCoding, UIScrollViewDelegate {
    .........
}

未完待续...

借鉴文章: iOS13适配

上一篇 下一篇

猜你喜欢

热点阅读