旋转设备后更新视图

马特

我正在制作一个可以在风景和肖像中使用的应用程序。它也可以将一些viewsscrollView(通过保存的坐标NSUserdefault)。

但我注意到2个大问题:

1)当我更改iPhone的方向时,我会views重置到其第一个位置。这个问题仅在我还没有触摸的时候出现views如果我触摸a viewsviewsiPhone旋转时另一个改变位置。

2)相同的问题,但当我滚动。如果我不触摸我,views它们将在滚动时更改为旧位置,并且只有一次。ps:出现问题后,如果我触摸一个视图,则所有视图都将更改为正确的位置。

我希望我讲得很好,因为英语不是我的母语,所以请告诉我是否忘记了数据。

请帮助我解决此问题。谢谢

瓦西里·博德纳丘克(Vasily Bodnarchuk)

您可以在此处重新定义所有视图框架:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
}

这是一个研究问题的例子

ViewController.swift

import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

var viewToMove = MyView(frame: CGRect(x: 40, y: 40, width: 80, height: 80))
@IBOutlet var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    viewToMove.setupView()

    scrollView.delegate = self
    scrollView.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.3)
    scrollView.addSubview(viewToMove)
    scrollView.contentSize = CGSize(width: 800, height: 800)

    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:)))
    viewToMove.addGestureRecognizer(longPressRecognizer)

    updatenavigationItem(UIScreen.mainScreen().bounds.size)

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Find", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(scrollToView))
}

func updatenavigationItem (size:CGSize) {
    navigationItem.title = "contentOffset: (\(scrollView.contentOffset.strings.x), \(scrollView.contentOffset.strings.y))"
    navigationItem.prompt = "frame size: \(size)"
}

func scrollViewDidScroll(scrollView: UIScrollView) {
    updatenavigationItem(UIScreen.mainScreen().bounds.size)
}

func scrollToView() {

    let width = UIScreen.mainScreen().bounds.width
    let height = UIScreen.mainScreen().bounds.height

    let x = self.viewToMove.frame.origin.x-width/2
    let y = self.viewToMove.frame.origin.y-height/2

    let centerPoint = CGPoint(x: x, y: y)
    self.scrollView.setContentOffset(centerPoint, animated: true)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//Called, when long press occurred
func longPress(longPressGestureRecognizer: UILongPressGestureRecognizer) {
    switch longPressGestureRecognizer.state  {

        case .Began:
            viewToMove.isMoving = true

        case .Changed:
            viewToMove.center = longPressGestureRecognizer.locationInView(scrollView)
            viewToMove.updateTitle()

        case .Ended:
            viewToMove.isMoving = false

        default :
            break
    }
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    updatenavigationItem(size)
}
}

MyView.swift

import UIKit

class MyView: UIView {

private var title = UILabel()

func setupView() {

    title = UILabel(frame: self.bounds)
    title.textAlignment = .Center
    title.numberOfLines = 2
    title.font = UIFont.systemFontOfSize(12)
    addSubview(title)

    isMoving = false
    updateTitle()
}

func updateTitle() {
    let x = center.strings.x
    let y = center.strings.y

    title.text = "x: \(x)\ny: \(y)"

}

private var _isMoving = false
var isMoving: Bool {
    set (newValue) {
        if newValue {
            backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.3)
            layer.borderWidth = 2
            layer.borderColor = UIColor.redColor().CGColor
            title.textColor = UIColor.blackColor()
        } else {
            backgroundColor = UIColor.grayColor()
            layer.borderWidth = 0
            title.textColor = UIColor.whiteColor()
        }
        _isMoving = newValue
    }
    get {
        return _isMoving
    }
}
}

CGPointExtension.swift

import UIKit

extension CGPoint {

var strings: (x:String, y:String) {
    get {
        let format = "%.2f"
        return (String(format: format, x), String(format: format, y))
    }
}
}

主板

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="JYS-qU-rv4">
<dependencies>
    <deployment identifier="iOS"/>
    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
    <!--Title-->
    <scene sceneID="tne-QT-ifu">
        <objects>
            <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_39229415" customModuleProvider="target" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                    <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                    <rect key="frame" x="0.0" y="94" width="600" height="506"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <subviews>
                        <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="b1d-Ez-GEw">
                            <rect key="frame" x="0.0" y="0.0" width="600" height="506"/>
                        </scrollView>
                    </subviews>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                    <constraints>
                        <constraint firstItem="b1d-Ez-GEw" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="3nd-VB-tHp"/>
                        <constraint firstItem="b1d-Ez-GEw" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="F0H-xs-R6q"/>
                        <constraint firstItem="b1d-Ez-GEw" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="cq1-PT-JDa"/>
                        <constraint firstAttribute="trailing" secondItem="b1d-Ez-GEw" secondAttribute="trailing" id="pen-6z-bT6"/>
                    </constraints>
                </view>
                <navigationItem key="navigationItem" title="Title" prompt="Prompt" id="cYl-MP-OqU"/>
                <connections>
                    <outlet property="scrollView" destination="b1d-Ez-GEw" id="wWc-h3-6FR"/>
                </connections>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1447" y="580"/>
    </scene>
    <!--Navigation Controller-->
    <scene sceneID="TvF-x4-hHN">
        <objects>
            <navigationController automaticallyAdjustsScrollViewInsets="NO" id="JYS-qU-rv4" sceneMemberID="viewController">
                <toolbarItems/>
                <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO"/>
                <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="EvU-Vd-zk0">
                    <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
                    <autoresizingMask key="autoresizingMask"/>
                </navigationBar>
                <nil name="viewControllers"/>
                <connections>
                    <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="xj1-QQ-ihb"/>
                </connections>
            </navigationController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="pjs-pr-Pd8" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="635" y="580"/>
    </scene>
</scenes>
</document>

您的固定代码

我建议您以编程方式创建view1和view2。

ViewController.swift

import UIKit
class ViewController: UIViewController {

@IBOutlet var scrollView: UIScrollView!

var view1 = UIView(frame: CGRect(x: 50, y: 50, width: 150, height: 150))
var view2 = UIView(frame: CGRect(x: 220, y: 50, width: 150, height: 150))

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.contentSize.width = 1000
    scrollView.contentSize.height = 1000

    initView(view1, color: UIColor.yellowColor())
    initView(view2, color: UIColor.blueColor())
}

func initView(viewToInit: UIView, color: UIColor) {
    viewToInit.backgroundColor = color
    viewToInit.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(ViewController.dragDrop(_:))))
    scrollView.addSubview(viewToInit)
}

func setupViewsCoordinates() {
    if let coord1 = NSUserDefaults.standardUserDefaults().valueForKey("coord1") as? String {
        self.view1.center = CGPointFromString(coord1)
        NSLog("\(self.view1.center)")
    }

    if let coord2 = NSUserDefaults.standardUserDefaults().valueForKey("coord2") as? String  {
        self.view2.center = CGPointFromString(coord2)
        NSLog("\(self.view2.center)")
    }

}

override func viewDidLayoutSubviews() {
    setupViewsCoordinates()
}

func dragDrop (sender: UIPanGestureRecognizer) {

    if let senderView = sender.view {

        let newPoint = sender.locationInView(scrollView)
        senderView.center = newPoint

        switch sender.state  {

            // case .Began:
            //case .Changed:

        case .Ended:

            switch senderView {
            case view1:
                NSUserDefaults.standardUserDefaults().setValue(NSStringFromCGPoint(newPoint), forKey: "coord1")

            case view2:
                NSUserDefaults.standardUserDefaults().setValue(NSStringFromCGPoint(newPoint), forKey: "coord2")

            default:
                break
            }

        default :
            break
        }
    }
}
}

主板

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="sZy-5d-rmJ">
<dependencies>
    <deployment identifier="iOS"/>
    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
    <!--View Controller-->
    <scene sceneID="tne-QT-ifu">
        <objects>
            <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_39229415" customModuleProvider="target" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                    <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <subviews>
                        <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iH0-w9-3Vi">
                            <rect key="frame" x="0.0" y="20" width="600" height="580"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="r4F-iB-85e">
                                    <rect key="frame" x="24" y="19" width="46" height="30"/>
                                    <state key="normal" title="back"/>
                                    <connections>
                                        <segue destination="sZy-5d-rmJ" kind="show" id="oqB-nQ-Cbx"/>
                                    </connections>
                                </button>
                            </subviews>
                        </scrollView>
                    </subviews>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                    <constraints>
                        <constraint firstItem="iH0-w9-3Vi" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="0JR-2o-xMa"/>
                        <constraint firstItem="iH0-w9-3Vi" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="H6h-8P-2lO"/>
                        <constraint firstItem="iH0-w9-3Vi" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="SXz-HG-hhh"/>
                        <constraint firstAttribute="trailing" secondItem="iH0-w9-3Vi" secondAttribute="trailing" id="s9E-4S-nuH"/>
                    </constraints>
                </view>
                <connections>
                    <outlet property="scrollView" destination="iH0-w9-3Vi" id="y87-TR-x9X"/>
                </connections>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1064" y="532"/>
    </scene>
    <!--View Controller-->
    <scene sceneID="jm6-I7-f2e">
        <objects>
            <viewController id="sZy-5d-rmJ" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="FVf-Ax-2ZB"/>
                    <viewControllerLayoutGuide type="bottom" id="LjK-dO-wuz"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="ERa-Mg-7aJ">
                    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <subviews>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pYW-PU-huc">
                            <rect key="frame" x="269" y="285" width="63" height="30"/>
                            <constraints>
                                <constraint firstAttribute="width" constant="63" id="5JS-Ml-DRK"/>
                                <constraint firstAttribute="height" constant="30" id="UDb-RY-Nvb"/>
                            </constraints>
                            <state key="normal" title="start test"/>
                            <connections>
                                <segue destination="BYZ-38-t0r" kind="show" id="PaJ-ee-tBZ"/>
                            </connections>
                        </button>
                    </subviews>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                    <constraints>
                        <constraint firstItem="pYW-PU-huc" firstAttribute="centerX" secondItem="ERa-Mg-7aJ" secondAttribute="centerX" id="PFN-01-ccJ"/>
                        <constraint firstItem="pYW-PU-huc" firstAttribute="centerY" secondItem="ERa-Mg-7aJ" secondAttribute="centerY" id="ooK-Nd-fOP"/>
                    </constraints>
                </view>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="9JD-Yr-djy" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="170" y="757"/>
    </scene>
</scenes>
</document>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

旋转设备后更新视图

来自分类Dev

表格视图中的UIImageView在单击或旋转设备后才会显示

来自分类Dev

旋转设备后重新布局

来自分类Dev

旋转iOS设备后uitableviewcell消失

来自分类Dev

旋转设备后出现NullPointer异常(SherlockDialogFragment)

来自分类Dev

如何防止设备旋转后意图重置?

来自分类Dev

旋转设备后DialogFragments重新排序

来自分类Dev

设备旋转后未设置 EditText

来自分类Dev

将设备更新到 Android Pie 9.0 后未加载视图

来自分类Dev

旋转后如何正确还原视图状态

来自分类Dev

旋转后如何获得超级视图的帧?

来自分类Dev

带片段旋转后无法修改视图

来自分类Dev

Android动画可旋转视图并在旋转后将其冻结

来自分类Dev

SwiftUI和ScrollView:设备旋转后视图消失

来自分类Dev

在 iOS 中使用 Autolayout 更改设备旋转时的视图方向

来自分类Dev

设备更新后更新GCM注册ID

来自分类Dev

TableView 仅在屏幕旋转后更新

来自分类Dev

ios消失后的更新视图

来自分类常见问题

Swift:如何在设备旋转后刷新UICollectionView布局

来自分类Dev

设备旋转后子片段中的过时活动参考

来自分类Dev

旋转设备后动画点将重新定位

来自分类Dev

旋转后将网页滚动到移动设备上的顶部

来自分类Dev

更新到 18.10 后声音设备丢失

来自分类Dev

解锁程序旋转锁定后,强制iOS ViewController旋转到设备方向

来自分类Dev

旋转后UICollectionView标头视图自动布局混乱

来自分类Dev

旋转后UICollectionView标头视图自动布局混乱

来自分类Dev

带匕首的 Moxy 在旋转后不保存视图状态

来自分类Dev

删除操作后AngularJS更新视图

来自分类Dev

在$ digest循环后,Angular如何更新视图?

Related 相关文章

热门标签

归档