我正在努力转换UIView为扩展,UIImage但我面临一个奇怪的问题,我能够在iOS模拟器中获得正确的图像,但我在真实设备中获得黑色图像.以下是我的代码
extension UIView {
func screenshotImage() -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0);
self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
let screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenShot!
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我做错了什么,我无法在真实设备中获得正确的图像?
编辑
观察:
每当我在模拟器中将UIView传递给此扩展时,我都能获得该视图的完美图像
每当我在实际设备中将UIView传递给此扩展时,我得到的图像完全是黑色而不是UIView中的元素,这与模拟器结果不同.
我知道这个问题可能会重复出现,但是请在投票之前阅读!
我在ReachabilityViewController其中命名了一个UIView pickerView,如下图所示
我想要的结果是这样的:
但是我得到了这个:
这是我的viewController类:
import UIKit
class ReachabilityViewController: UIViewController {
//MARK: pickerView outlets and actions
@IBOutlet weak var pickerView: UIView!
@IBOutlet weak var saveButton: UIButton!
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var startEndLabel: UILabel!
@IBOutlet weak var timePicker: UIDatePicker!
override func viewDidLoad() {
super.viewDidLoad()
pickerView.frame = CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
}
// MARK: - Table view data source
extension ReachabilityViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) …Run Code Online (Sandbox Code Playgroud) [编辑] 我推送了一个包含零高度约束的解决方案的提交,但是,现在我必须处理隐式 UISV 约束。
我花了几个小时来了解如何更改堆栈视图中出现/消失项目的动画。我想从屏幕底部为这两个按钮的出现设置动画,但是,它们总是从右上角飞出:
是否有任何 Cocoa 方法可以将动画配置为从底部开始?PS项目链接。
动画块:
UIView.animate(withDuration: 5.0,
delay: 0.5,
options: .curveEaseInOut,
animations:
{
self.buttons.forEach { $0.isHidden = !$0.isHidden }
self.stack.layoutIfNeeded()
}, completion: nil)
Run Code Online (Sandbox Code Playgroud) 所以你可以得到 UIScreen 的宽度和高度如下...
public var screenWidth: CGFloat {
return UIScreen.main.bounds.width
}
public var screenHeight: CGFloat {
return UIScreen.main.bounds.height
}
Run Code Online (Sandbox Code Playgroud)
但是如何获得 UIView 的宽度和高度呢?
你们中的任何人都知道如何在视图中获取子视图列表?有一种方法可以将列表放入数组中吗?
NSMutableArray *subviews= .... //all my subviews
Run Code Online (Sandbox Code Playgroud) 所以我试图以这种方式加载webView而不是Storyboard
override func loadView() {
let config = WKWebViewConfiguration( )
webView = WKWebView(frame: .zero, configuration : config)
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://vk.com")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
}
Run Code Online (Sandbox Code Playgroud)
显然,webView的框架为零,因此我应该看不到屏幕上的任何内容,但我看到了完整的webView窗口。请也许我没有考虑到重要的事情?
理解这些东西如何组合在一起是一个问题.有人可以一劳永逸地解释它们的区别以及它们如何一起使用?
谢谢
我在使用UIView(UIButton)在Swift中制作动画时遇到了麻烦.有人可以帮忙吗?这是我的代码.我主要遇到方法[UIView.beginAnimations]的问题.它需要我传入一个String和一个CMutableVoidPointer.这当前崩溃了.谢谢
var newCenter:CGPoint = CGPointMake(playAgainButton.center.x, playAgainButton.center.y + 200)
[UIView.beginAnimations(nil, context: nil)]
[UIView.setAnimationDuration(1.0)]
playAgainButton.center = newCenter
[UIView.commitAnimations]
Run Code Online (Sandbox Code Playgroud) 在viewDidLoadUIViewController 的方法内:
NSLog(@"frame: %f %f", self.view.frame.size.width, self.view.frame.size.height);
Run Code Online (Sandbox Code Playgroud)
使用横向设备:
frame: 748.000000 1024.000000
Run Code Online (Sandbox Code Playgroud)
设备处于纵向状态:
frame: 768.000000 1004.000000
Run Code Online (Sandbox Code Playgroud)