你怎么能为UIButton和旋转文字UILabel?90度,180度.
注意:在将此标记为重复之前,我有意将我的问题建模为此问题的Swift版本:如何在Objective-C中为UIButton和UILabel旋转文本?
我有一个UIScrollView实现takeScreenshot方法的decedent,如下所示:
-(void)takeScreenshot {
CGRect contextRect = CGRectMake(0, 0, 768, 1004);
UIGraphicsBeginImageContext(contextRect.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// do something with the viewImage here.
}
Run Code Online (Sandbox Code Playgroud)
这基本上移动到滚动视图的顶部,并截取可见区域的屏幕截图.当iPad面向人像时,它可以正常工作,但当它处于横向时,图像的底部会被切断(因为可见区域的高度仅为748,而不是1004).
是否有可能获得快照UIScrollView,包括不在屏幕上的区域?或者我需要向下滚动视图,拍摄第二张照片并将它们拼接在一起?
如果你根据标题来讨论这个问题,但对蒙古语不感兴趣,你可能会寻找这个问答:
我一直在学习Swift,以便为传统的蒙古语开发iOS应用程序.问题是传统的蒙古语是从上到下,从左到右垂直书写的.我的问题是如何垂直显示文本并仍然有换行功能?
如果你和我待在一起,我会试着更清楚地解释这个问题.下面是我想要实现的文本视图的图像.如果外国脚本将你抛弃,我已经包含了遵循相同模式的英文文本.事实上,如果应用程序有任何英文文本要显示,这应该是它的外观.

对于简单的单线UILabel,顺时针旋转90度就可以了.但是,对于多行UITextView,我需要处理换行.如果我只做一个普通的90度旋转,写的第一件事最终会在最后一行.
到目前为止,我已经制定了一个我认为可以解决这个问题的计划:

这应该照顾文本包装.
我可以做镜像字体.但是,我不知道如何为UITextView的旋转和镜像执行Swift编码.我发现以下链接似乎给解决方案的部分提示,但它们都在Objective C中,而不是在Swift中.
应用程序商店中有传统的蒙古应用程序(像这样和这个),但我还没有找到任何人共享他们的源代码,所以我不知道他们在幕后做什么来显示文本.我打算让我的代码开源,以便将来的其他人不会为数百万阅读传统蒙古语的人开发应用程序.你可以给予这项努力的任何帮助,不仅是我,也是蒙古人民.即使你不了解自己,提出这个问题以使其更加明显也会有所帮助.
@ sangonz的答案仍然是一个很好的答案,但我暂时将其标记为已接受的答案,因为我无法让一切顺利.特别:
到目前为止,我一直在使用上面提到的原始方法,但我真正想要的是获得类似@sangonz提议的工作方式.
我现在也在考虑其他方法
我最初问过这个问题.我假设自定义视图加载时间缓慢的原因是因为将多个视图叠加在一起或者可能是因为一些递归问题.然而,在删除越来越多的代码以查看会产生什么影响后,可归结为我是否有UITextView礼物.因为我的问题的明显来源与我在第一个问题中所期望的那么不同,所以我决定开始一个新问题,而不是对旧问题添加冗长的更新.
我用两个视图控制器设置我的测试项目.第一个视图控制器上的按钮将show segue调用到第二个视图控制器.第二个视图控制器上有我的自定义视图.(使用第二个视图控制器让我了解加载自定义视图所需的时间.)
自定义视图代码:
import UIKit
@IBDesignable class UIMongolTextView: UIView {
var textView = UITextView() // key line
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect){
super.init(frame: frame)
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,唯一的区别UIView是我添加了一个UITextView属性.而且这种自定义视图加载速度非常慢.在Instruments中运行Allocations工具我得到以下结果(计数为997):
但是,如果我注释掉这条线
//var textView = UITextView()
Run Code Online (Sandbox Code Playgroud)
然后我自定义视图加载非常快,只有7的计数.
这里发生了什么?是否可以UITextView在自定义视图中使用属性并避免这种缓慢的加载时间?
我是iOS开发的新手,但为了开始使用垂直蒙古语脚本制作最基本的应用程序,我需要有一个垂直UITextView.我没有找到任何其他蒙古应用程序开发人员共享他们的代码所以我试图自己做.蒙古语从上到下书写,线条从左到右换行,如下图所示:

滚动应该是水平的(从左到右).
在之前的一个问题中,我提出了镜像字体和旋转和镜像的组合UITextView(因为这是我在Android中所做的).然而,在阅读了这个答案并进一步研究iOS的做事方式(比如使用TextKit)之后,我认为UIVerticalTextView从头开始创建类似的东西可能会更好,而不是搞乱正常情况UITextView.因为我看到UITextView来自UIScrollView的inheirits,我认为我应该继承UIScrollView来制作UIVerticalTextView.
我上面提到的答案UIView是子类,但我在滚动工作时遇到了很多麻烦.这是我想要子类化的另一个原因UIScrollView.当方向改变时,该解决方案也没有重新布置每行中的单词.
我收集了以下部分,但我不确定如何将它们组合在一起:
UIVerticalTextView?照顾?UIVerticalTextView - 这将是一个子类,UIScrollView但需要添加和/或覆盖的方法是什么?
class UIVerticalTextView: UIScrollView {
// Which properties to include?
// - TextStorage
// - TextContainer
// - LayoutManager
// which methods to override?
// which methods to add to …Run Code Online (Sandbox Code Playgroud)我制作了一个垂直文本视图,用于蒙古语.它是一个自定义文本视图,由三层视图组成:子UITextView视图,容器视图(旋转90度并翻转)以保存UITextView和父视图.(有关更多背景信息,请参阅此处和此处.)
只要介于最小和最大大小之间,视图就会根据基础文本视图的内容大小增加其大小.但是,在过去的几天里,我一直在努力修复一个错误,即添加了一个额外的空间并且内容向左移动(这将在底层文本视图的坐标上).这可以在下图中观察到.黄色视图是自定义文本视图(inputWindow在下面的视图控制器代码中调用.)
点击输入几次以增加内容视图的大小后,会添加一个额外的空格.试图滚动视图什么也没做.(在宽度达到最大值并且内容大小大于帧大小之后滚动会起作用.)就好像内容在它被放置到正确位置之前被冻结到位时处于滚动的中间位置.如果我插入另一个字符(如空格),则内容视图会将其自身更新到正确的位置.
我需要改变什么?或者,如何手动强制底层UITextView显示其内容视图在正确的位置?
我试图删除所有无关的代码,只留下View Controller和Custom Vertical TextView的相关部分.如果还有其他我应该包括的内容,请告诉我.
查看控制器
视图控制器在内容视图大小更改时更新自定义文本视图的大小约束.
import UIKit
class TempViewController: UIViewController, KeyboardDelegate {
let minimumInputWindowSize = CGSize(width: 80, height: 150)
let inputWindowSizeIncrement: CGFloat = 50
// MARK:- Outlets
@IBOutlet weak var inputWindow: UIVerticalTextView!
@IBOutlet weak var topContainerView: UIView!
@IBOutlet weak var keyboardContainer: KeyboardController!
@IBOutlet weak var inputWindowHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var inputWindowWidthConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// get rid …Run Code Online (Sandbox Code Playgroud) 我学会了如何使用仿射变换旋转视图(参见此处).我还了解了自动布局(参见此处和此处),甚至是程序化的自动布局(参见此处和此处).但是,我不知道如何让自动布局与旋转视图一起使用.
此图显示了我想要做的事情:

我认为问题来自宽度和高度因旋转而变化.有没有办法让旋转视图填充它的超视图?是否有一些技巧可以使自动布局工作或旋转后它是不兼容的?
(我只学过Swift,但如果你更熟悉的话,我会很高兴通过Objective-C答案.)
按照@ VinayJain的建议,我做了以下事情:
为子视图的所有边上的间距约束创建了IBOutlets.
@IBOutlet weak var rightSpace: NSLayoutConstraint!
@IBOutlet weak var leftSpace: NSLayoutConstraint!
@IBOutlet weak var topSpace: NSLayoutConstraint!
@IBOutlet weak var bottomSpace: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)旋转子视图
subview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
Run Code Online (Sandbox Code Playgroud)改变了网点的限制
self.rightSpace.constant = CGFloat(0)
self.leftSpace.constant = CGFloat(0)
self.topSpace.constant = CGFloat(0)
self.bottomSpace.constant = CGFloat(0)
Run Code Online (Sandbox Code Playgroud)但就在这一点上,我意识到我并不需要改变间距值.我希望间距保持为0.我只需要它来调整自己.然而,旋转混乱了.效果如下图所示:
我想创建一个自定义视图,它有一个 UITableView 作为子视图。
自定义视图以编程方式创建表视图。但是,对于外部世界(即 ViewController),自定义视图本身似乎是一个表视图。
import UIKit
class CustomTableView: UIView {
// Do I make outlets?
//@IBOutlet var dataSource: UITableViewDataSource?
//@IBOutlet var delegate: UITableViewDelegate?
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect){
super.init(frame: frame)
}
override func awakeFromNib() {
super.awakeFromNib()
}
override func layoutSubviews() {
super.layoutSubviews()
var tableView: UITableView!
tableView = UITableView(frame: self.bounds)
// I'm not sure how to set the delegate and dataSource
// tableView.dataSource = ???
// tableView.delegate = ???
self.addSubview(tableView)
}
} …Run Code Online (Sandbox Code Playgroud) ios ×8
swift ×6
uitextview ×4
rotation ×2
uilabel ×2
autolayout ×1
custom-view ×1
ipad ×1
iphone ×1
performance ×1
uibutton ×1
uiscrollview ×1
uitableview ×1