相关疑难解决方法(0)

如何在Swift中旋转UIButton和UILabel的文本?

你怎么能为UIButton和旋转文字UILabel?90度,180度.

注意:在将此标记为重复之前,我有意将我的问题建模为此问题的Swift版本:如何在Objective-C中为UIButton和UILabel旋转文本?

rotation uibutton uilabel ios swift

62
推荐指数
3
解决办法
5万
查看次数

旋转UIView围绕其中心保持其大小

我正在尝试旋转UIView几个弧度,但在应用转换后,它看起来并不保持其大小.实现这个目标的正确方法是什么?

这是我正在做的和我得到的(箭头的蓝色框是我试图旋转的视图 - 它应该保持与红框背后相同的方面):

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(CGAffineTransformIdentity, rads);
self.arrowView.transform = transform;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

谢谢!

objective-c rotation uiview ios

51
推荐指数
7
解决办法
6万
查看次数

在Swift中使用Unicode代码点

如果您对Mongolian的细节不感兴趣,但只想快速回答有关在Swift中使用和转换Unicode值的问题,请跳到接受答案的第一部分.


背景

我想渲染传统蒙古语的 Unicode文本,以便在iOS应用程序中使用.更好和长期的解决方案是使用AAT智能字体来渲染这个复杂的脚本.(这些字体确实存在,但它们的许可证不允许修改和非个人使用.)但是,由于我从未制作过字体,更不用说AAT字体的所有渲染逻辑了,我只是打算自己进行渲染.斯威夫特现在.也许在以后我可以学习制作智能字体.

在外部我将使用Unicode文本,但在内部(在a中显示UITextView)我将Unicode转换为以哑字体存储的单个字形(用Unicode PUA值编码).所以我的渲染引擎需要将蒙古语Unicode值(范围:U + 1820到U + 1842)转换为存储在PUA中的字形值(范围:U + E360到U + E5CF).无论如何,这是我的计划,因为它是我过去在Java中所做的,但也许我需要改变我的整个思维方式.

下图显示su在蒙古语中使用两种不同形式的字母u(红色)两次写入.(蒙古文是垂直书写的,字母连接像英文草书一样.)

在此输入图像描述

在Unicode中,这两个字符串将表示为

var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"
Run Code Online (Sandbox Code Playgroud)

自由变量选择器(U + 180B)in suForm2被Swift识别(正确)String为与其前面的u(U + 1826)的单位.Swift认为它是一个单一的字符,一个扩展的字形集群.但是,为了自己进行渲染,我需要将u(U + 1826)和FVS1(U + 180B)区分为两个不同的UTF-16代码点.

出于内部显示的目的,我将上述Unicode字符串转换为以下呈现的字形字符串:

suForm1 = "\u{E46F}\u{E3BA}" 
suForm2 = "\u{E46F}\u{E3BB}"
Run Code Online (Sandbox Code Playgroud)

我一直在玩Swift StringCharacter.关于它们有很多方便的东西,但是因为在我的特殊情况下我只使用UTF-16代码单元,我想知道我是否应该使用旧的NSString而不是Swift的String.我意识到我可以String.utf16 …

string unicode ios swift mongolian-vertical-script

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

如何围绕自己的中心旋转子视图?

是否可以围绕自己的中心旋转视图?

在我目前的实现中,子视图(按钮等)似乎在它们最终位于所需位置之前沿着有趣的路径移动(因为超视图的坐标系被旋转).我希望这些视图在自己的中心周围旋转90度,如下图所示.

期望的轮换

rotation autorotate ios

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

iOS:屏幕上的镜像内容

我想知道是否可以翻转UIView同一设备中的内容; 不是指外部显示器,而是设备本身.

我在谷歌搜索了一下,但我能找到的只是外屏.

objective-c uiview cgaffinetransform ios

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

如何通过从Swift中的UIScrollView继承它来创建一个垂直的UITextView?

背景

我是iOS开发的新手,但为了开始使用垂直蒙古语脚本制作最基本的应用程序,我需要有一个垂直UITextView.我没有找到任何其他蒙古应用程序开发人员共享他们的代码所以我试图自己做.蒙古语从上到下书写,线条从左到右换行,如下图所示:

在此输入图像描述

滚动应该是水平的(从左到右).

之前的一个问题中,我提出了镜像字体和旋转和镜像的组合UITextView(因为这是我在Android中所做的).然而,在阅读了这个答案并进一步研究iOS的做事方式(比如使用TextKit)之后,我认为UIVerticalTextView从头开始创建类似的东西可能会更好,而不是搞乱正常情况UITextView.因为我看到UITextView来自UIScrollView的inheirits,我认为我应该继承UIScrollView来制作UIVerticalTextView.

我现在在哪里

我上面提到答案UIView是子类,但我在滚动工作时遇到了很多麻烦.这是我想要子类化的另一个原因UIScrollView.当方向改变时,该解决方案也没有重新布置每行中的单词.

我收集了以下部分,但我不确定如何将它们组合在一起:

  • NSTextStorage - 这应该没有什么不同.它只存储蒙古语Unicode文本和任何样式信息.
  • NSTextContainer - 需要切换高度和宽度以提供垂直文本容器大小.(我想是的,无论如何.除非这可以在其他地方完成.)
  • NSLayoutManager - 有什么特别需要在这里完成或是由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)

uiscrollview uitextview ios swift mongolian-vertical-script

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

Flutter的垂直文本小部件

TextDirection文档说:

Flutter旨在满足使用世界上当前使用的任何语言编写的应用程序的需求,无论它们使用从右到左还是从左到右的书写方向。Flutter不支持其他书写模式,例如竖排文本或Boustrophedon文本,因为这些模式很少在计算机程序中使用。(添加了重点)

Flutter不仅不支持垂直文本,而且将来也不会正式支持它。这是一个早期的设计决定(请参阅此处此处)。

即使这样,今天对垂直脚本的支持还是有实际用途的。除了某些中文和日文用法外,传统的蒙古文字还需要它。该脚本在内蒙古的计算机程序中非常常用(例如exampleexampleexampleexampleexampleexample)。

它是从上到下写的,行从左到右环绕:

在此处输入图片说明

此外,表情符号和CJK字符在垂直显示时仍保持其方向(并非绝对必要,而是首选)。在下图中,顶部显示了当前的实现,底部显示了正确的垂直渲染:

在此处输入图片说明

// sample text
???? ????? ????? ????? ???? ???????? ??????? ?????? ???? ???? one two three four five six seven eight nine ten ?? ??? ????? English? ???????
Run Code Online (Sandbox Code Playgroud)

由于Flutter不支持垂直脚本,因此必须从头开始实施。所有实际的文本布局和绘画都是使用LibTxt在Flutter引擎中完成的,所以我无法更改它。

创建从上到下的垂直文本小部件会涉及什么?

更新资料

我还在寻找答案。Rémi的答案适用于单行文本,但不适用于多行文本。

我目前正在研究三种不同的可能解决方案:

  • 创建一个RenderObject子类(或者可能是RenderParagraph子类)来支持类似于RichText小部件的自定义StatelessWidget。
  • 使用CustomPaint小部件
  • 制作一个ListView(每行文本一行),Text小部件和WidgetSpans的复合小部件。

所有这些将涉及测量文本,对其进行布局并获得行列表。

另一个更新

我目前倾向于制作自定义的小部件和渲染对象,以模仿RichText和RenderParagraph。在后台,RenderParagraph使用TextPainter来布局和绘制文本。我现在的问题是TextPainter与底层的Skia LibTxt库紧密耦合。这就是所有实际布局和绘画的地方。除了默认的ltr和rtl外,将文本放置在其他任何地方都被证明是一个大问题。

另一个更新

接受的答案符合我在这个问题中提出的标准。我认为它将满足短期需求。对于应用文字样式,我有些保留,但我需要做更多测试。从长远来看,我仍然可以尝试自定义文本布局和绘画。

custom-widgets dart flutter mongolian-vertical-script

14
推荐指数
3
解决办法
1214
查看次数

调整大小后,UITextView的内容会被多余的空间放错位置

背景和问题的描述

我制作了一个垂直文本视图,用于蒙古语.它是一个自定义文本视图,由三层视图组成:子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)

uitextview ios swift mongolian-vertical-script

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

如何在Android中制作传统的蒙古文字TextView

你如何使用Android应用程序进行垂直(从左到右的换行)Mongolian脚本TextViews?

背景

Android对世界上许多语言都有相当好的支持,甚至包括阿拉伯语和希伯来语等RTL语言.然而,对于像传统蒙古语这样的自上而下的语言没有内置的支持(在内蒙古仍然非常活跃,不能与西里尔语蒙古语混淆).下图显示了为清晰起见添加了英语的文本方向.

在此输入图像描述

由于此功能未内置于Android中,因此几乎使应用程序开发的每个方面都非常困难.在线提供的信息非常非常少.(少数几个相关的SO问题之一甚至没有一个好的答案.)有许多应用程序开发人员为传统的蒙古语,但无论是出于商业原因还是其他原因,他们似乎并没有使他们的代码开源.

由于存在这些困难,我想提出一系列StackOverflow问题,这些问题可以作为收集与传统蒙古应用程序开发相关的一些更困难的编程问题的答案的中心位置.即使您没有蒙古语识字,我们也会感谢您帮助查看代码,提出意见和问题,给出答案甚至对问题进行投票.

蒙古文垂直TextView

蒙古语TextView需要满足以下要求:

  • 支持传统的蒙古语字体
  • 从上到下垂直显示文本
  • 换行从左到右.
  • 换行发生在一个空间(与英语相同)

(由于TypeFace可以在以后设置,因此TextView支持Mongolian字体不是绝对的要求,但是在使用许多TextView时它很方便.)

我的答案如下,但我欢迎其他方法来解决这个问题.

本系列中的其他相关问题:

iOS版:

android vertical-text textview mongolian-vertical-script

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

如何在自定义视图中嵌入 UITableView

目标

我想创建一个自定义视图,它有一个 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)

uitableview custom-component ios swift

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

Android中如何制作传统蒙古文ListView

如何在Android应用程序中为垂直蒙古文字制作水平滚动的ListView?

背景

Android 对世界上许多语言都有相当好的支持,甚至是阿拉伯语和希伯来语等 RTL 语言。然而,没有像传统蒙古语这样的对自上而下的语言的内置支持(在内蒙古仍然很活跃,不要与西里尔蒙古语混淆)。下图显示了文本方向,为清楚起见添加了英文。

在此输入图像描述

由于此功能未内置于 Android 中,因此应用程序开发的几乎每个方面都变得极其困难。对于水平 ListView 来说尤其如此,Android 中不支持开箱即用的水平 ListView。网上提供的信息也非常非常少。有许多传统蒙古文的应用程序开发人员,但无论是出于商业原因还是其他原因,他们似乎都没有将其代码开源。

由于这些困难,我想提出一系列 StackOverflow 问题,这些问题可以作为收集与传统蒙古应用程序开发相关的一些更困难的编程问题的答案的中心位置。即使您不懂蒙古语,我们也将不胜感激您帮助审查代码、提出评论和问题、给出答案甚至对问题进行投票。

蒙古文垂直滚动ListView

蒙古文ListView需要满足以下要求:

  • 从左向右水平滚动
  • 触摸事件的工作方式与普通 ListView 相同
  • 与普通 ListView 一样支持自定义布局

还需要支持蒙古文 TextView支持的所有内容:

  • 支持传统蒙古文字体
  • 从上到下垂直显示文本
  • 换行是从左到右。
  • 换行出现在空格处(与英语相同)

下图展示了蒙古文ListView应具备的基本功能:

在此输入图像描述

我的答案如下,但我欢迎其他解决此问题的方法。

本系列其他相关问题:

iOS:

android listview vertical-text horizontal-scrolling mongolian-vertical-script

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

如何在Swift中使用字符串初始化NSTextStorage

为了将另一个问题分解成更小的部分,我试图设置所有的TextKit组件.但是,在更改初始化方式后,我遇到了崩溃NSTextStorage.出于测试目的,我已将项目简化为以下内容:

import UIKit

class ViewController3: UIViewController {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var myTextView: MyTextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let container = NSTextContainer(size: myTextView.bounds.size)
        let layoutManager = NSLayoutManager()
        let textStorage = NSTextStorage(string: "This is a test")
        layoutManager.addTextContainer(container)

        //layoutManager.textStorage = textView.textStorage  // This works
        layoutManager.textStorage = textStorage  // This doesn't work

        myTextView.layoutManager = layoutManager

    }
}

class MyTextView: UIView {

    var layoutManager: NSLayoutManager?

    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext();

        // Enumerate …
Run Code Online (Sandbox Code Playgroud)

ios nstextstorage swift

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

在layoutSubviews中旋转视图

背景和目标

目标:我想旋转和翻转UITextView.(为什么:看我之前的问题)

问题:如果我直接对其进行转换UITextView,文本布局会因某种未知原因而混乱.

解决方案:将其UITextView放入UIView容器中,然后对容器执行转换.

新问题:旋转视图上的自动布局(或任何类型的布局)成为一个主要问题.

建议的解决方案:创建一个子类UIView,作为旋转和翻转的附加容器UIView.然后,自动布局应该在此自定义视图上工作.

在此输入图像描述

当前的问题

它首先出现时有效(UITextView背景为黄色):

在此输入图像描述

但是当方向发生变化时,会发生以下情况(蓝色是子类UIView背景,在IB中设置):

在此输入图像描述

如果我禁用该rotationView.addSubview(textView)行,那么旋转容器视图(红色)会自行重新定位,即使在方向更改时也是如此:

在此输入图像描述

所以问题必须是关于我添加的地方UITextView.但是我该怎么办呢?

class MongolTextView: UIView {

    // properties
    var rotationView: UIView!
    var textView: UITextView!

    // This method gets called if you create the view in the Interface Builder
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    // This method …
Run Code Online (Sandbox Code Playgroud)

subclass rotation uiview ios swift

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