let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController =
storyboard.instantiateViewController(withIdentifier:
"secondViewController") as! SecondViewController
self.present(secondViewController, animated: true,
completion: nil)
Blur Background für eine View in Swift:
Dieser Code muss in die viewDidLoad Funktion:
view.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .extralight)
let blurView = UIVisualEffectView(effect: blurEffect)
blurView.translatesAutoresizingMaskIntoConstraints = false
view.insertSubview(blurView, at: 0)
NSLayoutConstraint.activate([
blurView.topAnchor.constraint(equalTo: view.topAnchor),
blurView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
blurView.heightAnchor.constraint(equalTo: view.heightAnchor),
blurView.widthAnchor.constraint(equalTo: view.widthAnchor)
])
Problem: Nach wenigen Sekunden stockt das Bild und bleibt schließlich stehen. Abhilfe schafft nur ein Umschalten, und nach einigen Sekunden hängt es wieder.
Ursache: MagentaTV benötigt IGMPv3, Entertain kam mit IGMPv2 aus.
Lösung:
Falls ein Switch zum Einsatz kommt, muss er IGMPv3 unterstützen
Man benötigt für die PFSense / OPNSense das Paket igmp-proxy.
Nach der Installation muss man in den Settings ein UP & Downstream Interface einstellen:
Ausserdem müssen zwei Firewall Regeln auf dem WAN Interface erstellt werden:
Regel für IGMP:
Action: Pass Interface: WAN Address Family: IPv4 Protocoll: IGMP Source: Any Destination: ANY Description: MagentaTV_IGMP Advanced Options: Allow IP Options muss aktiviert sein.
Regel für UDP anlegen:
Action: Pass Interface: WAN Address Family: IPv4 Protocol: UDP Source: Any Destination: ANY Description: MagentaTV_UDP
Wichtig ist die Option "Allow IP Options" Genau diese Option muss dann auch noch in der LAN Firewall Regel "Default allow LAN to any rule" die normalerweise automatisch erstellt wird aktiviert werden.
Stand der Info: 24.05.2021
- Batterie abklemmen
- Unterbodenverkleidung abschrauben (6 8er Schrauben)
- Massekabel abschrauben, Schraube zur Seite legen, siehe #
- Getriebeinöleinfüllschraube (Inbus 14) öffnen um sicherzugehen das man das neue Öl einfüllen kann
- Getriebeölablassschraube öffnen, Öl ablaufen lassen
- Schraube mit neuer Dichtung wieder rein (60nm)
- Getriebequerträger abschrauben, zwei 13er in der Mitte + 2 17er an den Seiten
- Motor kippt leicht nach hinten
- Tachowelle abschrauben (8er)
- Kupplungsnehmerzylinder abschrauben (Kupplung muss dann nicht entlüftet werden, 2 Schrauben)
- Kardanwelle abschrauben und leicht zusammenschieben (3Schrauben)
- Wenn die Hardyscheibe mit gewechselt wird, alle 6 Schrauben entfernen
- Schaltgestänge aushaken + Markieren
- 10x Getriebeschrauben lockern
- Getriebe unterbauen / Getriebeheber
- Nach hinten rausziehen und wegheben
- Öleinfüllschraube öffnen und ATF III einfüllen bis es seitlich rauskommt, ca 1,7l
- Öleinfüllschraube mit neuer Dichtung einschrauben (60nm)
- Ausrücklager austauschen, einfach abziehen und wieder einlegen
- Getriebestirnseite reinigen (Bremsenreiniger)
- Kupplungskorb abschrauben 6x 8er Imbus
- Korb und alte Scheibe abnehmen
- Neue Scheibe richtigherum rein, Korb dran und zwei Schrauben mit der Hand eindrehen
- Kupplungsscheibe mit Dorn zentrieren
- Dorn drinlassen und alle Imbus Schrauben über Kreuz anziehen (25nm)
- Dorn abziehen
- Evtl. Motorseite reinigen (Bremsenreiniger)
- Nehmerzylinder über das Getriebe legen
- Getriebe wieder reinheben, von hinten einschieben, nicht verkanten
- Schrauben wieder eindrehen und Festziehen
- Kardanwelle wieder Montieren (45nm)
- Restlicher Einbau wie vorher rückwärts
Attention: Application ID changes with every Appstart since iOS 8
do {
let documentsURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let docs = try FileManager.default.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: [], options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants])
let images = docs.filter{ $0.pathExtension == "xxx" }
print(images)
} catch {
print(error)
}
//Delete Image from Notification
if lentItems.imageURL == nil {
//no image to delete
} else {
let fileManager = FileManager.default
do {
try fileManager.removeItem(atPath: lentItems.imageURL!)
} catch {
print("Could not delete Image: \(error)")
}
}
do {
let attachment = try UNNotificationAttachment(identifier: "bild", url: imageURL, options: nil)
content.attachments = [attachment ]
} catch {
print("Attachment could not be loaded" )
}
// Create a URL
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let imageURL = documentsURL?.appendingPathComponent("\(String(describing: title)).png")
// save image to URL
if thumbnailData == nil {
print("No Picture")
} else {
let notificationImage = UIImage(data: thumbnailData as! Data) // or wherever you have your UIImage
do {
try UIImagePNGRepresentation(notificationImage!)?.write(to: notificationImageURL!)
} catch {
print("Couldnt save image" )
}
}
In viewDidLoad:
//Dissmiss Keyboard
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
Function:
//Dismiss Keyboard
@objc func dismissKeyboard() {
view.endEditing(true)
}
//MARK: Contacts
func checkContactsStatus() {
let status = CNContactStore.authorizationStatus(for: .contacts)
if status == .denied || status == .restricted {
presentSettingsActionSheet()
return
}
}
//Ask for Contact Permissions
func presentSettingsActionSheet() {
let alert = UIAlertController(title: "Permission to Contacts", message: "This app needs access to contacts in order to ...", preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "Go to Settings", style: .default) { _ in
let url = URL(string: UIApplicationOpenSettingsURLString)!
UIApplication.shared.open(url)
})
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
present(alert, animated: true)
}
func contactPicker(_ picker: CNContactPickerViewController,
didSelect contactProperty: CNContactProperty) {
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
// You can fetch selected name and number in the following way
// user name
let userName:String = contact.givenName
let surName:String = contact.familyName
let fullName:String = userName + " " + surName
print(fullName)
contactTextField.text = fullName
// user phone number
// let userPhoneNumbers:[CNLabeledValue<CNPhoneNumber>] = contact.phoneNumbers
// let firstPhoneNumber:CNPhoneNumber = userPhoneNumbers[0].value
// user phone number string
// let primaryPhoneNumberStr:String = firstPhoneNumber.stringValue
// print(primaryPhoneNumberStr)
}
func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
}
func chooseContact() {
let contactPicker = CNContactPickerViewController()
contactPicker.delegate = self
contactPicker.displayedPropertyKeys =
[CNContactGivenNameKey
, CNContactPhoneNumbersKey]
self.present(contactPicker, animated: true, completion: nil)
}
Info.plist
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>